如何声明具有用户定义维度的numpy矩阵np.zero?



>假设我想声明一个矩阵,看起来像这样:

A=20
B=30
C=40
matrix = np.zeros(shape=(A,B,C),dtype=float)

现在我需要使用相互嵌套的连续 for 循环来填充这个矩阵:

*

for i in range(0,A):
for j in range(0,B):
for k in range(0,C):
matrix[i][j][k] = ....

*

我想为 n 个变量实现相同的代码,其中 n 在运行时之前是未知的。我该如何解决这个问题?

虽然我认为这在开放式情况下不是一个好主意,但这里有一个通用方法,其中初始形状是我必须指定的全部。

In [188]: ashape = (2,3,4)                                                                             
In [189]: arr = np.zeros(ashape)                                                                       
In [190]: arr.shape                                                                                    
Out[190]: (2, 3, 4)

ndindex是生成所有索引组合的几种工具之一:

In [191]: list(np.ndindex(ashape))                                                                     
Out[191]: 
[(0, 0, 0),
(0, 0, 1),
(0, 0, 2),
(0, 0, 3),
(0, 1, 0),
(0, 1, 1),
....
(1, 2, 3)]

应用于设置arr值:

In [192]: for idx in np.ndindex(ashape): 
...:     arr[idx] = np.sum(idx) 
...:                                                                                              
In [193]: arr                                                                                          
Out[193]: 
array([[[0., 1., 2., 3.],
[1., 2., 3., 4.],
[2., 3., 4., 5.]],
[[1., 2., 3., 4.],
[2., 3., 4., 5.],
[3., 4., 5., 6.]]])

我可以通过其他方式生成该数组,例如

In [198]: np.indices((2,3,4)).sum(axis=0)                                                              
Out[198]: 
array([[[0, 1, 2, 3],
[1, 2, 3, 4],
[2, 3, 4, 5]],
[[1, 2, 3, 4],
[2, 3, 4, 5],
[3, 4, 5, 6]]])
In [199]: idx = np.indices((2,3,4), sparse=True)                                                       
In [200]: idx                                                                                          
Out[200]: 
(array([[[0]],
[[1]]]), array([[[0],
[1],
[2]]]), array([[[0, 1, 2, 3]]]))
In [201]: sum(idx)                                                                                     
Out[201]: 
array([[[0, 1, 2, 3],
[1, 2, 3, 4],
[2, 3, 4, 5]],
[[1, 2, 3, 4],
[2, 3, 4, 5],
[3, 4, 5, 6]]])

最新更新