gpt4 book ai didi

python - 将 itertools 数组转换为 numpy 数组

转载 作者:行者123 更新时间:2023-11-28 22:40:44 25 4
gpt4 key购买 nike

我正在创建这个数组:

A=itertools.combinations(range(6),2)

我必须用 numpy 操作这个数组,比如:

A.reshape(..

如果维度 A 很高,则命令 list(A) 太慢。

如何将 itertools 数组“转换”为 numpy 数组?

更新 1:我试过 hpaulj 的解决方案,在这种特定情况下有点慢,知道吗?

start=time.clock()

A=it.combinations(range(495),3)
A=np.array(list(A))
print A

stop=time.clock()
print stop-start
start=time.clock()

A=np.fromiter(it.chain(*it.combinations(range(495),3)),dtype=int).reshape (-1,3)
print A

stop=time.clock()
print stop-start

结果:

[[  0   1   2]
[ 0 1 3]
[ 0 1 4]
...,
[491 492 494]
[491 493 494]
[492 493 494]]
10.323822
[[ 0 1 2]
[ 0 1 3]
[ 0 1 4]
...,
[491 492 494]
[491 493 494]
[492 493 494]]
12.289898

最佳答案

我重新打开它是因为我不喜欢链接的答案。接受的答案建议使用

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 的最快方法是通过 itertools.chain 的惯用用法来扁平化 combinations:

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)fromiter 占用的时间是 array 的一半。


[numpy] itertools 上快速搜索会发现一些关于生成所有组合的纯 numpy 方法的建议。 itertools 速度很快,用于生成纯 Python 结构,但将它们转换为数组是一个缓慢的步骤。


问题的挑剔之处。

A 是生成器,而不是数组。 list(A) 确实生成了一个嵌套列表,可以粗略地描述为一个数组。但它不是 np.array,也没有 reshape 方法。

关于python - 将 itertools 数组转换为 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33282369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com