gpt4 book ai didi

python - 在二维数组的列内排名

转载 作者:太空宇宙 更新时间:2023-11-03 13:42:35 24 4
gpt4 key购买 nike

>>> a = array([[10, 50, 20, 30, 40],
... [50, 30, 40, 20, 10],
... [30, 20, 20, 10, 50]])

>>> some_np_expression(a)
array([[1, 3, 1, 3, 2],
[3, 2, 3, 2, 1],
[2, 1, 2, 1, 3]])

什么是some_np_expression?不关心领带是如何解决的,只要排名是不同的和连续的。

最佳答案

Double argsort 是执行此操作的标准(但效率低下!)方法:

In [120]: a
Out[120]:
array([[10, 50, 20, 30, 40],
[50, 30, 40, 20, 10],
[30, 20, 20, 10, 50]])

In [121]: a.argsort(axis=0).argsort(axis=0) + 1
Out[121]:
array([[1, 3, 1, 3, 2],
[3, 2, 3, 2, 1],
[2, 1, 2, 1, 3]])

通过更多代码,您可以避免排序两次。请注意,我在以下内容中使用了不同的 a:

In [262]: a
Out[262]:
array([[30, 30, 10, 10],
[10, 20, 20, 30],
[20, 10, 30, 20]])

调用argsort一次:

In [263]: s = a.argsort(axis=0)

使用s构造排名数组:

In [264]: i = np.arange(a.shape[0]).reshape(-1, 1)

In [265]: j = np.arange(a.shape[1])

In [266]: ranked = np.empty_like(a, dtype=int)

In [267]: ranked[s, j] = i + 1

In [268]: ranked
Out[268]:
array([[3, 3, 1, 1],
[1, 2, 2, 3],
[2, 1, 3, 2]])

这是效率较低(但更简洁)的版本:

In [269]: a.argsort(axis=0).argsort(axis=0) + 1
Out[269]:
array([[3, 3, 1, 1],
[1, 2, 2, 3],
[2, 1, 3, 2]])

关于python - 在二维数组的列内排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27736753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com