【问题标题】:How can this numpy 2D sorted array creation be optimized?如何优化这个 numpy 2D 排序数组的创建?
【发布时间】:2014-07-16 22:44:26
【问题描述】:

我有一个名为 coefficients 的 NxM 矩阵,我想对其进行排序:

import numpy
N = 10
M = 42
coefficients = numpy.random.uniform(size=(N, M))

我有一个名为order 的数组,其中包含N 元素,它表示coefficients 的行应该处于的顺序:

order = numpy.random.choice(range(N), N, False)

我正在通过排序ordercoefficients进行排序:

coefficients = numpy.array([mag for (orig, mag)
                            in sorted(zip(order, coefficients),
                                      key=lambda pair: pair[0])])

这行得通,但它可能比它应该的要慢。如果这是一维的,我会使用fromiter,但我不知道如何解决这个问题,因为它是二维的。我可以在这里进行优化吗?

【问题讨论】:

    标签: python arrays optimization numpy


    【解决方案1】:

    要回答你的问题,coefficients[order.argsort()] 就足够了 :)

    另见Numpy: sort by key function

    【讨论】:

    • 这与原始代码的方向相反 - OP 的代码有 original[0] 转到 result[order[0]] 而不是 result[0] 来自 original[order[0]]。这可能是一个可接受的差异,具体取决于order 需要如何表现。如果没有,我们需要coefficients[order.argsort()]
    • (我不知道为什么其他人删除了他们的答案。有两个已删除的答案已经提供了此信息。)
    • 天啊,太明显了。谢谢你们两个!
    • @JoeKington,他可能也这么认为:D
    • 另外值得注意的是,如果排序变得昂贵,result = numpy.empty_like(coefficients); result[order] = coefficients 可以避免排序。在问题中给出的规模上,这不是问题,但是有数百万行,就会有很大的不同。
    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 2019-07-10
    • 1970-01-01
    • 2022-09-23
    • 2019-08-02
    • 2020-06-15
    • 2021-08-15
    • 2015-08-05
    相关资源
    最近更新 更多