2016-04-15 3 views
1

У меня есть Numpy матрицу:Python: numpy.matrix.resize перемещает элементы

[[ 0. 0.2 0. ] 
[ 0. 0. 0.2] 
[ 0. 0. 0. ]] 

, когда я изменить его matrix.resize(4, 4), чтобы иметь одну дополнительную строку и столбец, она становится:

[[ 0. 0.2 0. 0. ] 
[ 0. 0.2 0. 0. ] 
[ 0. 0. 0. 0. ] 
[ 0. 0. 0. 0. ]] 

элемент во второй строке перемещается влево. Кажется, что все элементы перемещены, а внизу - 0..

Я бы ожидать, что матрица станет:

[[ 0. 0.2 0. 0. ] 
[ 0. 0. 0.2 0. ] 
[ 0. 0. 0. 0. ] 
[ 0. 0. 0. 0. ]] 

Как я могу это исправить?

Обратите внимание, что я делаю это для многих разных матриц с множеством разных значений. Поэтому я ищу простое решение, которое работает для любой размерной матрицы, хотя добавленный столбец и строка должны содержать все 0.

Спасибо!

ответ

4

Вы можете использовать np.pad раздуть массив:

import numpy as np 

arr = np.array([[ 0., 0.2, 0. ], 
       [ 0., 0., 0.2], 
       [ 0., 0., 0. ]]) 
np.pad(arr, pad_width=([0,1], [0,1]), mode='constant') 

дающий

array([[ 0. , 0.2, 0. , 0. ], 
     [ 0. , 0. , 0.2, 0. ], 
     [ 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 0. , 0. ]]) 

pad_width=([0,1], [0,1]) говорит np.pad добавить

  • нулевых строк сверху
  • один ряд на нижнее
  • нулевые столбцы на левой
  • одну колонку на правой

mode='constant' использует 0 в качестве постоянной величины пусковой площадки по умолчанию. Есть много других режимов, таких как 'reflect', 'linear_ramp', 'edge', 'constant', 'minimum', 'wrap', 'симметричный', 'median', 'maximum', 'mean' ,

+0

Спасибо, это работает отлично! –

1

np.pad делает работу:

import numpy as np 

a = np.array([[1, 2], [3, 4]]) 
print a 

b=np.pad(a, ((0,2),(0,1)), mode='constant', constant_values=0) 
print b