Python: изменить размер существующего массива и заполнить нулями - PullRequest
24 голосов
/ 12 февраля 2012

Я думаю, что моя проблема должна быть очень простой, но я не могу найти никакой помощи в Интернете.Я очень плохо знаком с Python, поэтому, возможно, мне не хватает чего-то очень очевидного.

У меня есть массив S, например, [x x x] (one-dimensional).Я сейчас создаю диагональную матрицу, sigma, с np.diag(S) - пока все хорошо.Теперь я хочу изменить размер этого нового диагонального массива, чтобы я мог умножить его на другой имеющийся у меня массив.

import numpy as np
...
shape = np.shape((6, 6)) #This will be some pre-determined size
sigma = np.diag(S) #diagonalise the matrix - this works
my_sigma = sigma.resize(shape) #Resize the matrix and fill with zeros - returns "None" - why?

Однако, когда я печатаю содержимое my_sigma, я получаю "None".Может ли кто-нибудь, пожалуйста, указать мне правильное направление, потому что я не могу себе представить, что это должно быть так сложно.

Заранее благодарен за любую помощь!

Каспер

Графическое изображение:

У меня есть это:

[x x x]

Я хочу это:

[x 0 0]
[0 x 0]
[0 0 x]
[0 0 0]
[0 0 0]
[0 0 0] - or some similar size, but the diagonal elements are important.

Ответы [ 5 ]

55 голосов
/ 06 мая 2013

В версии 1.7.0 numpy.pad появилась новая функция numpy, которая может делать это в одну строку. Как и другие ответы, вы можете построить диагональную матрицу с помощью np.diag перед заполнением. Кортеж ((0,N),(0,0)), использованный в этом ответе, указывает «сторону» матрицы, которую нужно дополнить.

import numpy as np

A = np.array([1, 2, 3])

N = A.size
B = np.pad(np.diag(A), ((0,N),(0,0)), mode='constant')

B теперь равно:

[[1 0 0]
 [0 2 0]
 [0 0 3]
 [0 0 0]
 [0 0 0]
 [0 0 0]]
19 голосов
/ 12 февраля 2012

sigma.resize() возвращает None, потому что он работает на месте.np.resize(sigma, shape), с другой стороны, возвращает результат, но вместо заполнения нулями дополняет повторы массива .

Также shape() функция возвращает форму входа .Если вы просто хотите заранее определить форму, просто используйте кортеж.

import numpy as np
...
shape = (6, 6) #This will be some pre-determined size
sigma = np.diag(S) #diagonalise the matrix - this works
sigma.resize(shape) #Resize the matrix and fill with zeros

Однако это сначала сгладит ваш исходный массив, а затем восстановит его в заданную форму, разрушив исходный порядок.Если вы просто хотите «дополнить» нулями, вместо использования resize() вы можете просто напрямую индексировать сгенерированную нулевую матрицу.

# This assumes that you have a 2-dimensional array
zeros = np.zeros(shape, dtype=np.int32)
zeros[:sigma.shape[0], :sigma.shape[1]] = sigma
4 голосов
/ 13 февраля 2012

Я вижу правку ... сначала нужно создать нули, а затем переместить в них несколько чисел.np.diag_indices_from может быть полезно для вас

bigger_sigma = np.zeros(shape, dtype=sigma.dtype)
diag_ij = np.diag_indices_from(sigma)
bigger_sigma[diag_ij] = sigma[diag_ij] 
2 голосов
/ 25 сентября 2017

Это решение работает с resize функцией

Взять образец массива

S= np.ones((3))
print (S)
# [ 1.  1.  1.]
d= np.diag(S) 
print(d)
"""
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]

"""

Это Dosent работа, просто добавить повторяющиеся значения

np.resize(d,(6,3))
"""
adds a repeating value
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
"""

Этот работает

d.resize((6,3),refcheck=False)
print(d)
"""
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]
 [ 0.  0.  0.]
 [ 0.  0.  0.]
 [ 0.  0.  0.]]
"""
0 голосов
/ 05 марта 2017

Другое чистое решение Python -

a = [1, 2, 3]
b = []
for i in range(6):
    b.append((([0] * i) + a[i:i+1] + ([0] * (len(a) - 1 - i)))[:len(a)])

b сейчас

[[1, 0, 0], [0, 2, 0], [0, 0, 3], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

это отвратительное решение, я признаю это. Тем не менее, он иллюстрирует некоторые функции типа list, которые можно использовать.

...