我想更改
中列元素的顺序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]
的结果(第二行充满零也应该被考虑在内,但在这个例子中它包含相同的值)。
答案 0 :(得分:3)
您需要numpy.lexsort,这相当于argsort
,但基于多个排序键;给定多个数组,它返回索引以按顺序对数组进行排序:
给定多个排序键,可以将其解释为a中的列 电子表格,lexsort返回一个整数索引数组 按多列描述排序顺序。最后一把钥匙 sequence用于主排序顺序,倒数第二个键 对于二级排序顺序,等等。 keys参数必须是a 可以转换为相同形状的数组的对象序列。 如果为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]])