numpy 中 argsort() 的用户定义决胜局
User defined tie breaker for argsort() in numpy
我有两个数组 v
和 c
(可以读作价值和成本)。
我需要在v
上执行argsort()
,如果v
中的2个元素相同,则需要根据它们在[=13中的对应元素进行排序=].
例子
v = [4,1,4,4] # Here 0th, 2nd and 3rd elemnt are equal
c = [5,0,30,10]
numpy.argsort(v) = [1,0,2,3] # equal values sorted by index
需要输出
[1,0,3,2] # c[0] < c[3] < c[2]
如何在 Python 中实现这一点?
函数 argsort 接收一个 order
参数,来自文档:
When a is an array with fields defined, this argument specifies which
fields to compare first, second, etc.
因此您可以从这两个值创建一个结构化数组,然后按顺序传递字段:
import numpy as np
v = [4, 1, 4, 4]
c = [5, 0, 30, 10]
s = np.array(list(zip(v, c)), dtype=[('value', 'i4'), ('cost', 'i4')])
result = np.argsort(s, order=['value', 'cost'])
print(result)
输出
[1 0 3 2]
我有两个数组 v
和 c
(可以读作价值和成本)。
我需要在v
上执行argsort()
,如果v
中的2个元素相同,则需要根据它们在[=13中的对应元素进行排序=].
例子
v = [4,1,4,4] # Here 0th, 2nd and 3rd elemnt are equal
c = [5,0,30,10]
numpy.argsort(v) = [1,0,2,3] # equal values sorted by index
需要输出
[1,0,3,2] # c[0] < c[3] < c[2]
如何在 Python 中实现这一点?
函数 argsort 接收一个 order
参数,来自文档:
When a is an array with fields defined, this argument specifies which fields to compare first, second, etc.
因此您可以从这两个值创建一个结构化数组,然后按顺序传递字段:
import numpy as np
v = [4, 1, 4, 4]
c = [5, 0, 30, 10]
s = np.array(list(zip(v, c)), dtype=[('value', 'i4'), ('cost', 'i4')])
result = np.argsort(s, order=['value', 'cost'])
print(result)
输出
[1 0 3 2]