我重新打开此问题是因为我不喜欢链接的答案。接受的答案建议使用
np.array(list(A)) # producing a (15,2) array
但OP显然已经尝试过list(A)
,发现速度很慢。
另一个答案建议使用np.fromiter
。但隐藏在其评论中的是这样的注释:fromiter
需要一维数组。
In [102]: A=itertools.combinations(range(6),2)
In [103]: np.fromiter(A,dtype=int)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-103-29db40e69c08> in <module>()
----> 1 np.fromiter(A,dtype=int)
ValueError: setting an array element with a sequence.
所以使用fromiter
使用此 itertools 需要以某种方式展平迭代器。
一组快速的时间安排表明list
这一步并不慢。它将列表转换为数组的速度很慢:
In [104]: timeit itertools.combinations(range(6),2)
1000000 loops, best of 3: 1.1 µs per loop
In [105]: timeit list(itertools.combinations(range(6),2))
100000 loops, best of 3: 3.1 µs per loop
In [106]: timeit np.array(list(itertools.combinations(range(6),2)))
100000 loops, best of 3: 14.7 µs per loop
我认为最快的使用方法fromiter
是为了压平combinations
惯用的用法itertools.chain
:
In [112]: timeit
np.fromiter(itertools.chain(*itertools.combinations(range(6),2)),dtype=int)
.reshape(-1,2)
100000 loops, best of 3: 12.1 µs per loop
至少在这么小的尺寸上,并没有节省多少时间。 (fromiter
还需要一个count
,这又减少了 µs。有了更大的外壳,range(60)
, the fromiter
需要一半的时间array
.
快速搜索[numpy] itertools
出现了一些生成所有组合的纯 numpy 方法的建议。itertools
对于生成纯 Python 结构来说速度很快,但是将它们转换为数组是一个缓慢的步骤。
关于这个问题的一个挑剔点。
A
是一个生成器,而不是一个数组。list(A)
确实会产生一个嵌套列表,可以将其宽松地描述为数组。但这不是一个np.array
,并且没有reshape
method.