给定一个数组'a',我想按列sort(a, axis=0)
对数组进行排序,然后撤销排序。我不是说重新排序,而是基本上反转每个元素的移动方式。我假设argsort()
是我需要的,但我不清楚如何用argsort()
的结果对数组进行排序,或者更重要的是应用反转/argsort()
的逆
这里是一个小细节
我有一个数组a
,shape(a) = rXc
我需要对每列进行排序
aargsort = a.argsort(axis=0) # May use this later
aSort = a.sort(axis=0)
现在求每行的平均值
aSortRM = asort.mean(axis=1)
现在用行平均值替换行中的每个列。有比这更好的方法吗
aWithMeans = ones_like(a)
for ind in range(r) # r = number of rows
aWithMeans[ind]* aSortRM[ind]
现在我需要撤销我在第一步中所做的排序。
7条答案
按热度按时间lokaqttq1#
对于你实际要解决的问题,可能有比这更好的解决方案(执行argsort通常排除了实际排序的需要),但这里是:
a8jjtwal2#
对于那些还在寻找答案的人:
qv7cva1a3#
我不确定如何在
numpy
中最好地做到这一点,但是,在纯Python中,理由是:aargsort
保存了range(len(a))
的排列,告诉你aSort
的项来自哪里--很像在纯Python中:即,
sorted(x)
的第一个参数将是x[2]
,第二个参数将是x[4]
,以此类推。因此,给定排序后的版本,您可以通过“将项目放回它们来自的地方”来重建原始版本:
当然,在
numpy
中会有更紧凑、更快速的方法来表达这一点(不幸的是,我对numpy
的了解不如对Python本身的了解那么多;- ),但我希望这通过展示您需要执行的“把东西放回原位”操作的底层逻辑来有所帮助。56lgkhnf4#
虽然游戏很晚了,但在这里:
基本上,argsort是argsort,因为反向排序的第n个元素是J[n] = k:I[k] = n,也就是说,I[J[n]] = n,所以J对I排序。
6vl6ewon5#
indices=np.argsort(a)
给出了排序索引,这样x = a[indices]
就是排序数组。y = b[indices]
将数组b
前推到排序域。c[indices] = z
将z
从排序域拉回到源域中的c
。比如说
iezvtpos6#
我没能理解你的例子,但是更抽象的问题--即如何对数组排序,然后反转排序--是很简单的。
从A_sorted“重构”A是很简单的,因为记住,你首先使用了一个索引数组('ndx')来对数组进行排序。
换句话说,A_sorted中的第4行是原始数组A中的第1行,依此类推。
cl25kdpy7#
获得argsort逆的更快的替代方案,灵感来自Alex Martelli
对于大于1E4的阵列,我看到性能提高了10倍