繁体   English   中英

用numpy排序数组

[英]Sorting array with numpy

我想改变列元素的顺序

a = np.asarray(
[[0,1,1,2,2,2,2,3,3,3,4,4,4,4,4,4],
 [4,0,3,0,1,2,5,1,2,5,3,4,6,6,7,7],
 [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
 [0,1,0,0,1,1,1,0,0,0,1,1,0,1,0,1]]
)

基于第1-3行的值(基于0)。 我的解决方案目前如下所示:

a[:, a.transpose()[:, 1].argsort(axis=0)]

array([[1, 2, 2, 3, 2, 3, 1, 4, 0, 4, 2, 3, 4, 4, 4, 4],
       [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1]])

这很好,除了我还想在搜索中包含2-3行(按字典顺序)。 理想情况下,我希望最后一行是[0, 1, 0, 1, ..., 0, 1] (第二行充满零也应该考虑在内,但在这个例子中它包含相同的值)。

你需要numpy.lexsort ,它相当于argsort但基于多个排序键; 给定多个数组,它返回索引以按顺序对数组进行排序:

给定多个排序键(可以解释为电子表格中的列),lexsort返回一个整数索引数组,用于按多列描述排序顺序。 序列中的最后一个键用于主要排序顺序,倒数第二个键用于辅助排序顺序,依此类推。 keys参数必须是可以转换为相同形状的数组的一系列对象。 如果为keys参数提供了2D数组,则将其行解释为排序键,并根据最后一行,第二行等排序。

a[:, np.lexsort(a[:0:-1])]
#array([[2, 1, 3, 2, 3, 2, 1, 4, 0, 4, 3, 2, 4, 4, 4, 4],
#       [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7],
#       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
#       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM