numpy np.argsort是否返回正确答案?

9wbgstp7  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(84)

我希望答案是完全的,否则,我不知道它是在什么基础上排序的指数。它应该按升序对数组进行排序,但我不能弄清楚它做了什么。

>>> random_array
array([[63, 28, 16,  5, 35],
       [77, 32, 87, 95, 33],
       [45, 40, 91, 14, 45]])

>>> np.argsort(random_array)
array([[3, 2, 1, 4, 0],
       [1, 4, 0, 2, 3],
       [3, 1, 0, 4, 2]], dtype=int64)

字符串
预期答案:

[[4,2,1,0,3] 
 [2,0,3,4,1]
 [3,1,4,0,2]]

nzkunb0c

nzkunb0c1#

argsort给出了排序顺序的索引。看起来你在找军衔:

np.argsort(np.argsort(a))

字符串
或者使用替代方案scipy.stats.rankdata

from scipy.stats import rankdata

rankdata(a, axis=-1, method='ordinal')-1


pandas.DataFrame.rank

import pandas as pd

pd.DataFrame(a).rank(axis=1, method='first').sub(1).to_numpy(dtype=a.dtype)


输出量:

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

注意事项

在提供的输出的第三行中,您将第一个45排在第二个45之后。为了实现这一点,你需要对左右翻转的数组进行排序:

np.argsort(np.argsort(a[:, ::-1]))[:, ::-1]

np.fliplr(np.argsort(np.argsort(np.fliplr(a))))

rankdata(a[: , ::-1], axis=-1, method='ordinal')[: , ::-1]-1

(pd.DataFrame(a[:, ::-1]).rank(axis=1, method='first')
   .sub(1).to_numpy(dtype=a.dtype)[:, ::-1]
)


输出量:

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


可再现输入:

a = np.array([[63, 28, 16,  5, 35],
              [77, 32, 87, 95, 33],
              [45, 40, 91, 14, 45]])

相关问题