Numpy:按键函数排序

14
有没有一种方法可以使用键(或比较器)函数对numpy ndarray的行进行排序,而不必转换为Python列表?
特别是,我需要根据以下函数进行排序:
c1,c2= 4,7
lambda row: c1*(row[1]/c2)+row[0]

我意识到一种可能的解决方案是生成一个包含每行键值的向量,但如何根据此向量进行排序?是否应该尝试将这样的向量转换为索引向量?

order= c1*(matrix[:,1]/c2)+matrix[:,0]
indexes= order_to_index( order )
return matrix[ indexes ]

这个现实吗?


2
order_to_index?您是否指的是 argsort - Ruggero Turra
@wiso 确实!我从未想到这与给出按键值向量排序的索引相同的问题! - loopbackbee
尝试运行以下代码:np.argsort([3,6,2,2,8]) #-> array([2, 3, 0, 1, 4])。它不会对您的原始输入进行排序。通常情况下,numpy函数不会产生副作用。 - Ruggero Turra
@wiso 确实,我刚刚编辑了我的上一篇帖子,对此抱歉。谢谢!您会考虑添加一个答案吗? - loopbackbee
2个回答

7

6
为了更明确的回答,假设我们有一个数组x,想要根据某个函数func对行进行排序,该函数接受x的一行作为输入并输出一个标量值。
x[np.apply_along_axis(func, axis=1, arr=x).argsort()]

针对此示例

c1, c2 = 4, 7
x = np.array([
    [0, 1],
    [2, 3],
    [4, -5]
])
x[np.apply_along_axis(lambda row: c1 * / c2 * row[1] + row[0], 1, x).argsort()]

输出:

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

在这种情况下,甚至不需要使用np.apply_along_axis
x[(c1 / c2 * x[:,1] + x[:,0]).argsort()]

输出:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接