我正在尝试迭代两个2D数组。但是,迭代器会以某种方式跳过行中的每个备用元素。'bimg'和'dist'大小为20x12。但是,对于每一行,它遍历0、2、4 ...列而不是0、1、2、3、4,...
程式码片段:
it = np.nditer([bimg, dist],
op_flags=[['readonly'],['readonly']],
flags = ['multi_index', 'multi_index'])
rows, cols = bimg.shape
print "bimg dimensions: ", bimg.shape
print "dist dimensions: ", dist.shape
for cur_b, cur_d in it:
print "MULTI_IDX = ", it.multi_index
输出:
bimg dimensions: (20L, 12L)
dist dimensions: (20L, 12L)
MULTI_IDX = (0, 0)
MULTI_IDX = (0, 2)
MULTI_IDX = (0, 4)
MULTI_IDX = (0, 6)
MULTI_IDX = (0, 8)
MULTI_IDX = (0, 10)
MULTI_IDX = (1, 0)
MULTI_IDX = (1, 2)
要理解此问题,如果我在python提示符下创建数组并尝试对其进行迭代,则可以正常工作:
正确的工作代码:
x = np.array(np.arange(240))
x = x.reshape(20,12)
y = np.array(np.arange(240))
y = y + 100
y = y.reshape(20,12)
it = np.nditer([x,y],
op_flags = [['readonly'],['readonly']],
flags= ['multi_index', 'multi_index'])
for a, b in it:
print it.multi_index
输出:
MULTI_INDEX = (0, 0)
MULTI_INDEX = (0, 1)
MULTI_INDEX = (0, 2)
MULTI_INDEX = (0, 3)
MULTI_INDEX = (0, 4)
MULTI_INDEX = (0, 5)
我看不出有什么区别。当我定义时:
bimg = x
dist = y
两个片段的迭代次数相同。
flags
只需要一次“ multi_index”。它适用于整个迭代,适用于op_flags
每个数组:
flags= ['multi_index']
尽管文档描述nditer
为efficient multi-dimensional iterator object
,但Python代码的速度似乎并没有太大帮助。在C或Cython中简化了遍历多个数组的整个过程。
这是生成的另一种方法multi_index
。其实没什么不同。在内部ndindex
构造所需形状的虚拟数组,并返回可迭代的。看一下它的代码。
for i, j in np.ndindex(bimg.shape):
print i,j
根据教程Iterating over Array
页面,正确的使用方法multi_index
是使用c
样式迭代器:
while not it.finished:
print it.multi_index
it.iternext()
我不知道为什么。是什么dtypes
的bimg
和dist
?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句