2012-06-03 3 views
5

В общем случае мы могли бы иметь матрицы произвольных размеров. Для моего приложения необходимо иметь квадратную матрицу. Также фиктивные записи должны иметь указанное значение. Мне интересно, есть ли что-нибудь, встроенное в numpy?Создание квадрата матрицы и добавление нужного значения в numpy

Или самый простой способ сделать это

EDIT:

Матрица X уже есть, и это не квадрат. Мы хотим добавить значение, чтобы сделать его квадратным. Положите его на фиктивное заданное значение. Все исходные значения останутся неизменными.

Большое спасибо

ответ

2

Для 2D Numpy массива m это просто сделать это путем создания max(m.shape) х max(m.shape) массив единиц p и умножив это на желаемое значение отступа, перед установкой срез p соответствующего m (т.е. p[0:m.shape[0], 0:m.shape[1]]) равным m.

Это приводит к следующей функции, где первая строка имеет дело с возможностью, что вход имеет только одно измерение (т.е. является массивом, а не матрицы):

import numpy as np 

def pad_to_square(a, pad_value=0): 
    m = a.reshape((a.shape[0], -1)) 
    padded = pad_value * np.ones(2 * [max(m.shape)], dtype=m.dtype) 
    padded[0:m.shape[0], 0:m.shape[1]] = m 
    return padded 

Так, например:

>>> r1 = np.random.rand(3, 5) 
>>> r1 
array([[ 0.85950957, 0.92468279, 0.93643261, 0.82723889, 0.54501699], 
     [ 0.05921614, 0.94946809, 0.26500925, 0.02287463, 0.04511802], 
     [ 0.99647148, 0.6926722 , 0.70148198, 0.39861487, 0.86772468]]) 
>>> pad_to_square(r1, 3) 
array([[ 0.85950957, 0.92468279, 0.93643261, 0.82723889, 0.54501699], 
     [ 0.05921614, 0.94946809, 0.26500925, 0.02287463, 0.04511802], 
     [ 0.99647148, 0.6926722 , 0.70148198, 0.39861487, 0.86772468], 
     [ 3.  , 3.  , 3.  , 3.  , 3.  ], 
     [ 3.  , 3.  , 3.  , 3.  , 3.  ]]) 

или

>>> r2=np.random.rand(4) 
>>> r2 
array([ 0.10307689, 0.83912888, 0.13105124, 0.09897586]) 
>>> pad_to_square(r2, 0) 
array([[ 0.10307689, 0.  , 0.  , 0.  ], 
     [ 0.83912888, 0.  , 0.  , 0.  ], 
     [ 0.13105124, 0.  , 0.  , 0.  ], 
     [ 0.09897586, 0.  , 0.  , 0.  ]]) 

т.д.

4

С Numpy 1.7 есть функция numpy.pad. Вот пример:

>>> x = np.random.rand(2,3) 
>>> np.pad(x, ((0,1), (0,0)), mode='constant', constant_values=42) 
array([[ 0.20687158, 0.21241617, 0.91913572], 
     [ 0.35815412, 0.08503839, 0.51852029], 
     [ 42.  , 42.  , 42.  ]]) 
1

Опираясь на ответ по LucasB здесь есть функция, которая будет подушечка произвольной матрицы M с заданным значением val так, что она становится площадью:

def squarify(M,val): 
    (a,b)=M.shape 
    if a>b: 
     padding=((0,0),(0,a-b)) 
    else: 
     padding=((0,b-a),(0,0)) 
    return numpy.pad(M,padding,mode='constant',constant_values=val) 
Смежные вопросы