我需要根据第一个子数组中的值对数据进行排序,尽可能快(该行应用数百万次)。
以下是我原来的一行,我试图改善其性能,但是没有效果。据我所知,我的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))
答案 0 :(得分:4)
对于lambdas
来说仍然是新手,但是从我的代码中我理解的很少 - 在lambda
方法中,您使用x[0]
来获取排序键然后使用它们从aa
中的每个元素中提取值。在NumPy术语中,这转换为获取数组版本中第一行的排序索引,然后索引到每一行(因为aa
的每个元素都成为数组a
的每一行)。这基本上是列索引。此外,似乎sorted
维护相同元素的顺序。因此,我们需要使用argsort(kind='mergesort')
。
因此,我们可以简单地做 -
a[:, a[0].argsort(kind='mergesort')] # a = np.array(aa)
在您的NumPy代码中,您没有对这些类别执行任何操作,因此无法提供正确的结果。