np.ndindex 在迭代指定维度方面做得很好。
您的x 是一个4d object 数组dtype=ndarray 变为dtype=object。尽管元组大小相同,但元素实际上只是标量,而不是数组。
In [385]: x
Out[385]:
array([[[[1, 2],
[1, 2]],
[[1, 2],
[1, 2]]],
[[[1, 2],
[1, 2]],
[[1, 2],
[1, 2]]]], dtype=object)
In [386]: x.shape
Out[386]: (2, 2, 2, 2)
在任何情况下,np.ndindex 都会生成将迭代给定形状的数组的索引。
In [387]: for i,j in np.ndindex(x.shape[:2]):
print(i,j)
print(x[i,j])
.....:
0 0
[[1 2]
[1 2]]
0 1
[[1 2]
[1 2]]
1 0
[[1 2]
[1 2]]
1 1
[[1 2]
[1 2]]
ndindex 的关键部分是as_strided 用于生成正确大小的虚拟矩阵,nditer 以multi_index 模式生成索引。
此用法的早期示例:
https://stackoverflow.com/a/28727290/901925
Iterating over first d axes of numpy array
更多关于尝试创建数组数组(不仅仅是更高维的数字数组):
Convert a numpy array to an array of numpy arrays
要创建一个真正是数组数组的x,您需要执行以下操作:
In [397]: x=np.zeros((2,2,2),dtype=object)
In [398]: for ijk in np.ndindex(x.shape):
x[ijk] = np.array([1,2])
In [399]: x
Out[399]:
array([[[array([1, 2]), array([1, 2])],
[array([1, 2]), array([1, 2])]],
[[array([1, 2]), array([1, 2])],
[array([1, 2]), array([1, 2])]]], dtype=object)
另一种选择是重塑初始尺寸,以便您可以对这些尺寸进行平面迭代:
for i in x.reshape(-1,2):
print(i)
nditer(以及扩展名ndindex)被描述为高效,但这更适用于其C/cython 的使用。在纯 Python 代码中,迭代机制并不重要。迭代主体中的操作通常需要更多时间。当您需要在多个数组上进行坐标迭代时,nditer 也是最好的,如out[...] = a[...] * b[...]。仅遍历一个数组并没有什么特别之处。
http://docs.scipy.org/doc/numpy-dev/reference/arrays.nditer.html
是一个很好的nditer 教程。最后的cython部分是最好的部分。