Mik*_*and 3 python sorting numpy scipy
>>> 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]])
Run Code Online (Sandbox Code Playgroud)
什么是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]])
Run Code Online (Sandbox Code Playgroud)
使用更多代码,您可以避免排序两次.请注意,我a在下面使用了不同的内容:
In [262]: a
Out[262]:
array([[30, 30, 10, 10],
[10, 20, 20, 30],
[20, 10, 30, 20]])
Run Code Online (Sandbox Code Playgroud)
打电话argsort一次:
In [263]: s = a.argsort(axis=0)
Run Code Online (Sandbox Code Playgroud)
使用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]])
Run Code Online (Sandbox Code Playgroud)
这是效率较低(但更简洁)的版本:
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]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1142 次 |
| 最近记录: |