有效地计算numpy数组中的排序排列

时间:2014-12-06 18:50:28

标签: python arrays performance numpy

我有一个numpy数组。计算所有排序排列的最快方法是什么。

我的意思是,鉴于我的数组中的第一个元素,我想要一个按顺序跟随它的所有元素的列表。然后给出第二个元素,列出其后面的所有元素。

所以给我的清单:b,c,& d跟随一个。 c& d跟随b,d跟随c。

x = np.array(["a", "b", "c", "d"])

所以潜在的输出如下:

[
    ["a","b"],
    ["a","c"],
    ["a","d"],

    ["b","c"],
    ["b","d"],

    ["c","d"],
]

我需要做几百万次,所以我正在寻找一种有效的解决方案。

我尝试过类似的事情:

im = np.vstack([x]*len(x))
a = np.vstack(([im], [im.T])).T
results = a[np.triu_indices(len(x),1)]

但它实际上比循环慢......

2 个答案:

答案 0 :(得分:3)

您可以使用itertoolschain.from_iterable>>> from itertools import combinations, chain >>> arr = np.fromiter(chain.from_iterable(combinations(x, 2)), dtype=x.dtype) >>> arr.reshape(arr.size/2, 2) array([['a', 'b'], ['a', 'c'], ['a', 'd'], ..., ['b', 'c'], ['b', 'd'], ['c', 'd']], dtype='|S1') 的功能>>> x = np.array(["a", "b", "c", "d"]*100) >>> %%timeit im = np.vstack([x]*len(x)) a = np.vstack(([im], [im.T])).T results = a[np.triu_indices(len(x),1)] ... 10 loops, best of 3: 29.2 ms per loop >>> %%timeit arr = np.fromiter(chain.from_iterable(combinations(x, 2)), dtype=x.dtype) arr.reshape(arr.size/2, 2) ... 100 loops, best of 3: 6.63 ms per loop 。这不涉及Python中的循环,但仍然不是纯粹的NumPy解决方案:

{{1}}

时间比较:

{{1}}

答案 1 :(得分:2)

我一直在浏览源代码,似乎tri函数最近有一些非常重大的改进。 The file is all Python所以如果有帮助,你可以将它复制到你的目录中。

考虑到这一点,我似乎与Ashwini Chaudhary的时间完全不同。

了解要执行此操作的阵列的大小非常重要;如果它很小,你应该缓存像triu_indices这样的中间体。

最快的代码是:

def triangalize_1(x):
    xs, ys = numpy.triu_indices(len(x), 1)
    return numpy.array([x[xs], x[ys]]).T

除非x数组很小。

如果x很小,则缓存效果最佳:

triu_cache = {}
def triangalize_1(x):
    if len(x) in triu_cache:
        xs, ys = triu_cache[len(x)]

    else:
        xs, ys = numpy.triu_indices(len(x), 1)
        triu_cache[len(x)] = xs, ys

    return numpy.array([x[xs], x[ys]]).T

由于内存要求,我不会对大型x执行此操作。