6

我正在尝试获取数组中所有元素的索引列表,因此对于 1000 x 1000 的数组,我最终得到 [(0,0), (0,1),...,(999,999) ]。

我做了一个函数来做到这一点,如下所示:

def indices(alist):
    results = []
    ele = alist.size
    counterx = 0
    countery = 0
    x = alist.shape[0]
    y = alist.shape[1]
    while counterx < x:
        while countery < y:
            results.append((counterx,countery))
            countery += 1
        counterx += 1
        countery = 0
    return results

在我计时后,它似乎很慢,因为它需要大约 650 毫秒才能运行(在慢速笔记本电脑上是允许的)。因此,考虑到 numpy 必须有一种比我平庸的编码更快的方法,我查看了文档并尝试了:

indices = [k for k in numpy.ndindex(q.shape)]
which took about 4.5 SECONDS (wtf?)
indices = [x for x,i in numpy.ndenumerate(q)]
better, but 1.5 seconds!

有没有更快的方法来做到这一点?

谢谢

4

3 回答 3

10

怎么样np.ndindex

np.ndindex(1000,1000)

这将返回一个可迭代对象:

>>> ix = numpy.ndindex(1000,1000)
>>> next(ix)
(0, 0)
>>> next(ix)
(0, 1)
>>> next(ix)
(0, 2)

一般来说,如果你有一个数组,你可以通过以下方式构建索引迭代:

index_iterable = np.ndindex(*arr.shape)

当然,也总是np.ndenumerate可以这样实现:

def ndenumerate(arr):
    for ix in np.ndindex(*arr.shape):
        yield ix,arr[ix]
于 2013-06-28T20:14:47.187 回答
4

你有没有想过使用itertools?它将为您的结果生成一个迭代器,并且几乎可以肯定会达到最佳速度:

import itertools

a = range(1000)
b = range(1000)

product = itertools.product(a, b)

for x in product:
    print x

# (0, 0)
# (0, 1)
# ...
# (999, 999)

请注意,这不需要依赖于numpy. range另外,请注意创建从 0 到 999 的列表的有趣用法。

于 2013-06-28T20:12:27.633 回答
3

啊哈!

使用numpy构建两个数组的所有组合的数组

运行时间为 41 毫秒,而使用 itertool.product 则需要 330 毫秒!

于 2013-06-29T20:51:47.773 回答