我需要根据第一个子数组中的值尽快对多维数组进行排序(该行被应用了数百万次)。
以下是我原来的路线,以及我改进其性能的尝试,但没有成功。据我所知,我的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))
说到这还是个新手lambdas
,但是从我从你的代码中了解到的一点点来看 - 它似乎在你的lambda
方法,您正在使用x[0]
获取排序键,然后使用它们从每个元素中提取值aa
。用 NumPy 术语来说,这意味着获取数组版本中第一行的排序索引,然后索引到每一行(因为aa
变成数组的每一行a
)。这基本上就是列索引。还有,看来sorted
保持相同元素的顺序。所以,我们需要使用argsort(kind='mergesort')
.
因此,我们可以简单地做 -
a[:, a[0].argsort(kind='mergesort')] # a = np.array(aa)
在您的 NumPy 代码中,您没有执行任何此类操作,因此没有给出正确的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)