注:我不确定这是否是重复的——请告诉我是否是重复的(并结束问题)。
如果有一个一维NumPy数组vector
,那么如果编写一个for循环,格式如下:
for element in vector :
print(element)
结果将打印NumPy数组的每个元素。
如果有一个二维NumPy数组matrix
,那么如果编写一个for循环的形式:
for vector in matrix :
print(vector)
结果将打印二维NumPy数组的每一行,即打印一维NumPy数组,并且将而不是分别打印数组的每个元素。
但是,如果改为将for循环写入:
import numpy
for element in numpy.nditer(matrix) :
print(element)
结果将打印二维NumPy数组的每个元素。
问题:如果有一个三维NumPy数组,tensor
会发生什么?
a.如果要编写窗体的for循环:
for unknownType in tensor :
print(unknownType)
这是否会打印构成tensor
的二维NumPy(sub-)数组?
即,对于n维NumPy数组nArray
,是否for unknownType in nArray :
在nArray
的组成(n-1)维NumPy(子)数组上迭代?
b.如果一个人写了表单的for循环:
for unknownType in numpy.nditer(tensor) :
print(unknownType)
这会打印tensor
的元素吗?或者它会打印组成二维NumPy(子)数组的一维NumPy(子)数组吗?
即,对于n维NumPy数组nArray
,是否for unknownType in nditer(nArray) :
迭代nArray
的元素?或者它是否迭代组成(n-2)维NumPy(sub-)数组的组成(n-1)维NumPy(sub-)数组的nArray
?
从名称nditer
我不清楚,因为我不知道“nd”代表什么(“iter”显然是“iter”的缩写)。而且人们可能认为元素是“0维NumPy数组”,所以给我的2维NumPy数组的例子是模棱两可的。
我已经看过^{
如果只使用
for
循环,则迭代在第一个维度上,如果数组只有一个维度,则这将是元素,如果是2D,则是行,如果是3D,则将在平面上迭代。。。然而
nditer
是一个ND(代表n维)迭代器。它将遍历数组中的每个元素。大概是吧相当于for item in your_array.ravel()
(在数组的平坦“视图”上迭代)。对于一维数组,它在元素上迭代;对于二维数组,它首先在第一行中的元素上迭代,然后在第二行上迭代,依此类推。注意
nditer
比它强大得多,它可以一次在多个数组上迭代,您可以缓冲迭代和许多其他东西。但是对于NumPy,您通常不想使用
for
-循环或np.nditer
。有许多“矢量化”操作使得手动迭代(在大多数情况下)不必要。(一)
for x in arr:
迭代数组的第一个维度。我认为它是
for x in list(arr):...
。它将数组分解成一个子数组列表。(二)
用
nditer
控制迭代的深度是很棘手的。默认情况下,它在元素级别迭代。教程页面显示了一些使用缓冲区和顺序的技巧。但我看到的最好的方法是使用ndindex
。ndindex
构造一个大小合适的伪数组,并执行multi_index
迭代。例如,要在三维数组的前二维上迭代:
我可以做同样的迭代
或者
速度基本上是一样的——与同时处理整个3d数组的数组函数或采用某种
axis
参数的数组函数相比,这一切都很糟糕。numpy as数组的类是
np.ndarray
。大概nditer
就是这样命名的。nditer
是作为一种整合c
级代码可以在数组上迭代的各种方法而编写的,特别是一些可广播的数组。np.nditer
函数允许访问c
级迭代器。但由于实际的迭代仍在Python代码中完成,因此几乎没有速度优势。相关问题 更多 >
编程相关推荐