Python:调整现有数组的大小并填充零

时间:2012-02-12 18:54:26

标签: python arrays matrix numpy resize

我认为我的问题应该很简单,但我找不到任何帮助 在互联网上。我是Python的新手,所以有可能 我错过了一些非常明显的事情。

我有一个数组,S,就像这个[x x x] (one-dimensional)。我现在创建一个 对角矩阵,sigmanp.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 个答案:

答案 0 :(得分:54)

版本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]]

答案 1 :(得分:19)

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

答案 2 :(得分:4)

我看到编辑...你必须先创建零,然后将一些数字移入其中。 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] 

答案 3 :(得分:2)

此解决方案适用于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.]]
"""

答案 4 :(得分:0)

另一个纯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类型的一些函数。