【问题标题】:Python numpy nditer skipping alternate elementsPython numpy nditer 跳过备用元素
【发布时间】:2016-02-25 23:22:35
【问题描述】:

我正在尝试遍历两个二维数组。但是,迭代器以某种方式跳过了行中的每个备用元素。 “bimg”和“dist”大小为 20x12。但是,对于每一行,它会迭代 0、2、4 ... 列而不是 0、1、2、3、4、...

代码 sn-p:

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)

【问题讨论】:

    标签: arrays python-2.7 numpy iterator


    【解决方案1】:

    我看不出有什么不同。当我定义:

    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()
    

    我不知道为什么。 bimgdistdtypes 是什么?

    【讨论】:

    • 感谢您指出“虽然不是它。完成”。其实我之前也用过,后来改成'for',却忘了去掉.iternext()。所以,这导致了迭代的跳跃。
    猜你喜欢
    • 1970-01-01
    • 2019-04-04
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多