>假设我想声明一个矩阵,看起来像这样:
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]]])