我使用的itertools.combinations()
如下所示:
import itertools
import numpy as np
L = [1,2,3,4,5]
N = 3
output = np.array([a for a in itertools.combinations(L,N)]).T
这就产生了我需要的输出:
array([[1, 1, 1, 1, 1, 1, 2, 2, 2, 3],
[2, 2, 2, 3, 3, 4, 3, 3, 4, 4],
[3, 4, 5, 4, 5, 5, 4, 5, 5, 5]])
我在多处理环境中反复地、过度地使用这个表达式,我需要它尽可能快。
通过this post,我了解到基于itertools
的代码不是最快的解决方案,使用numpy
可能是一种改进,但是我在numpy
优化技巧方面不够好,无法理解和适应那里编写的迭代代码或提出自己的优化。
任何帮助都将不胜感激。
编辑:L
来自一个panda Dataframe ,因此它也可以看作一个numpy数组:
L = df.L.values
3条答案
按热度按时间ogq8wdun1#
下面是一个比itertools UPDATE稍快的方法:另一个(
nump2
)实际上要快得多:时间:
bhmjp9jg2#
这肯定比
itertools.combinations
* 不 * 快,但它 * 是 * 矢量化的numpy:不确定这是否可以用另一种方式矢量化,或者这里的某个优化向导是否可以使这个方法更快。
编辑:想到了另一种方法,但仍然不比
combinations
快:5jvtdoz23#
我知道这个问题很老了,但我最近一直在研究它,它仍然可能会有帮助。从我(相当广泛)的测试中,我发现首先生成每个索引的组合,然后使用这些索引对数组进行切片,比直接从数组中进行组合要快得多。我确信使用@Paul Panzer的nump2函数生成这些索引会更快。
下面是一个例子:
显然,索引方法要快得多。