我认为我的问题应该很简单,但我找不到任何帮助 在互联网上。我是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.
答案 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
类型的一些函数。