【问题标题】:Fast sort multidimensional array快速排序多维数组
【发布时间】:2018-02-08 05:09:39
【问题描述】:

我需要尽可能快地根据第一个子数组中的值对多维数组进行排序(这条线被应用了数百万次)。

以下是我的原始行,以及我试图提高其性能的尝试,但这是行不通的。据我所知,我的numpy 方法只正确排序第一个子数组,其余的都没有。

我做错了什么,如何提高排序的性能?

import numpy as np

# Generate some random data.
# I receive the actual data as a list, hence the .tolist()
aa = np.random.rand(10, 2000).tolist()

# This is the original line I need to process faster.
b1 = zip(*sorted(zip(*aa), key=lambda x: x[0]))

# This is my attempt at improving the above line's performance
b2 = np.sort(np.asarray(aa).T, axis=0).T

# Check if all sub-arrays are equal
for a, b in zip(*[b1, b2]):
    print(np.array_equal(a, b))

【问题讨论】:

  • 马上,您可以尝试将lambda x: x[0] 替换为operator.itemgetter(0)
  • 谢谢,我现在就试试。但是为什么numpy 方法不起作用?我做错了什么?

标签: python arrays sorting numpy


【解决方案1】:

lambdas 方面仍然是个新手,但从我对您的代码了解的很少 - 似乎在您的 lambda 方法中,您正在使用 x[0] 获取排序键,然后使用它们来拉取aa 中每个元素的值。在 NumPy 术语中,这转化为获取数组版本中第一行的排序索引,然后索引到每一行(因为 aa 的每个元素变成数组 a 的每一行)。这基本上是列索引。此外,sorted 似乎维护了相同元素的顺序。所以,我们需要使用argsort(kind='mergesort')

因此,我们可以简单地做 -

a[:, a[0].argsort(kind='mergesort')] # a = np.array(aa) 

在您的 NumPy 代码中,您没有执行任何此类操作,因此没有给出正确的结果。

【讨论】:

  • 谢谢!这比我原来的方法快约 20 倍。你能解释一下我在使用numpy 和转置时做错了什么吗?这样我就可以从错误中吸取教训:)
  • 非常感谢 Divakar 的解释!
猜你喜欢
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
相关资源
最近更新 更多