注意:我不确定这是否重复 - 如果是,请告诉我(并关闭问题)。
如果有一个具有1维NumPy数组vector
,那么如果有人写一个形式的for循环:
for element in vector :
print(element)
结果将打印NumPy数组的每个元素。
如果有一个二维NumPy数组matrix
,那么如果有人写一个for循环的形式:
for vector in matrix :
print(vector)
结果将打印2维NumPy数组的每一行,即它将打印1维NumPy数组,并且不分别打印数组的每个元素。
但是,如果有人将for循环写为:
import numpy
for element in numpy.nditer(matrix) :
print(element)
结果将打印二维NumPy数组的每个元素。
问题:如果有一个3维NumPy数组tensor
会怎样?
a。如果有人写一个形式的for循环:
for unknownType in tensor :
print(unknownType)
这会打印tensor
的组成二维NumPy(子)数组吗?
即。对于n维NumPy数组nArray
,for unknownType in nArray :
迭代nArray
的成分(n-1)维NumPy(子)数组吗?
b。如果有人写一个形式的for循环:
for unknownType in numpy.nditer(tensor) :
print(unknownType)
这会打印tensor
的元素吗?或者它会打印tensor
的组成二维NumPy(子)数组的1维NumPy(子)数组吗?
即。对于n维NumPy数组nArray
,for unknownType in nditer(nArray) :
是否会迭代nArray
的元素?或者它是否迭代nArray
的成分(n-1)维NumPy(子)数组的成分(n-2)维NumPy(子)数组?
我不清楚名字nditer
,因为我不知道“nd”代表什么(“iter”显然是“迭代”的缩写)。并且可能人们可以将这些元素视为“0维NumPy数组”,因此给我的二维NumPy数组的示例是模糊的。
我看过np.nditer
documentation但老实说我不明白这些例子或者他们试图展示的内容 - 它似乎是程序员为程序员编写的(我不是)。< / p>
答案 0 :(得分:4)
A)
for x in arr:
迭代数组的第一维。
In [233]: for x in np.arange(24).reshape((2,3,4)):
...: print(x.shape)
...:
(3, 4)
(3, 4)
我认为它是for x in list(arr):...
。它将数组分解为一个子数组列表。
b)中
使用nditer
控制迭代深度很棘手。默认情况下,它会在元素级别进行迭代。教程页面显示了使用缓冲区和顺序的一些技巧。但我看到的最好的方法是使用ndindex
。
ndindex
构造一个正确大小的虚拟数组,并进行multi_index
次迭代。
例如,迭代3d数组的前2个维度:
In [237]: arr = np.arange(24).reshape(2,3,4)
In [240]: for idx in np.ndindex(arr.shape[:2]):
...: print(idx, arr[idx], arr[idx].sum())
...:
(0, 0) [0 1 2 3] 6
(0, 1) [4 5 6 7] 22
(0, 2) [ 8 9 10 11] 38
(1, 0) [12 13 14 15] 54
(1, 1) [16 17 18 19] 70
(1, 2) [20 21 22 23] 86
我可以用
做同样的迭代for i in range(2):
for j in range(3):
arr[i,j]...
或
arr1 = arr.reshape(-1,4)
for ij in range(6):
arr1[ij]....
速度基本相同 - 与同时处理整个3d数组的数组函数相比,或者采用某种axis
参数的数组函数都是差的。
In [241]: arr.sum(axis=2)
Out[241]:
array([[ 6, 22, 38],
[54, 70, 86]])
numpy作为数组的类是np.ndarray
。据推测,nditer
就是这样命名的。 nditer
被编写为一种整合c
级代码可以在数组上迭代的各种方法,特别是几个可广播的方法。 np.nditer
函数可以访问c
级别的迭代器。但由于实际迭代仍在Python代码中完成,因此速度优势很小甚至没有。
答案 1 :(得分:3)
如果您只使用for
循环,则迭代将超过第一维,如果数组只有一个维度,那么这将是元素,如果它是2D,则它将是行,如果它& #39;它将在飞机上迭代3D,......
然而nditer
是ND(代表n维)迭代器。它将迭代数组中的每个元素。它(大约!)相当于for item in your_array.ravel()
(迭代在数组的平坦&#34;视图&#34;)。对于1D数组,它迭代元素,对于2D数组,它首先在第一行中的元素上迭代,然后在第二行上迭代,依此类推。
请注意nditer
比这更强大,它可以一次迭代多个数组,你可以缓冲迭代和许多其他东西。
然而,对于NumPy,您通常不想要使用for
- 循环或np.nditer
。 很多&#34;矢量化&#34; <手动迭代(在大多数情况下)不必要的操作。