我刚接触numpy,所以我可能会遗漏一些令人讨厌的东西。
以下小argsort()
测试脚本会产生奇怪的结果。任何指示?
import numpy as np
a = np.array([[3, 5, 6, 4, 1] , [2, 7 ,4 ,1 , 2] , [8, 6, 7, 2, 1]])
print a
print a.argsort(axis=0)
print a.argsort(axis=1)
输出:
[[3 5 6 4 1]
[2 7 4 1 2]
[8 6 7 2 1]]
[[1 0 1 1 0] # bad 4th & 5th columns ?
[0 2 0 2 2]
[2 1 2 0 1]]
[[4 0 3 1 2] # what's going on here ?
[3 0 4 2 1]
[4 3 1 2 0]]
答案 0 :(得分:0)
正如其他人指出的那样,该方法正常工作,因此为了提供答案,这里是.argsort()
的工作方式的解释。 a.argsort
返回索引(不是值),以便沿指定轴对数组进行排序。
在您的示例中
a = np.array([[3, 5, 6, 4, 1] , [2, 7 ,4 ,1 , 2] , [8, 6, 7, 2, 1]])
print a
print a.argsort(axis=0)
返回
[[3 5 6 4 1]
[2 7 4 1 2]
[8 6 7 2 1]]
[[1 0 1 1 0]
[0 2 0 2 2]
[2 1 2 0 1]]
因为
[[3 ...
[2 ...
[8 ...
2
是最小值。因此,当前索引2(即0
)在argsort()
返回的矩阵中沿该轴处于第一个位置。第二个最小值是在索引3
处的0
,因此在返回的矩阵中沿该轴的第二个位置将是0
。最后,最大元素是2
,它出现在沿0轴的索引2
上,因此返回矩阵的最后一个元素将是2
。因此:
[[1 ...
[0 ...
[2 ...
沿着轴0的其他4个序列重复相同的过程:
[[...5 ...] [[...0 ...]
[...7 ...] becomes ----> [... 2 ...]
[...6 ...]] [... 1 ...]]
[[...6 ...] [[...1 ...]
[...4 ...] becomes ----> [... 0 ...]
[...7 ...]] [... 2 ...]]
[[...4 ...] [[...1 ...]
[...1 ...] becomes ----> [... 2 ...]
[...2 ...]] [... 0 ...]]
[[...1] [[...0]
[...2] becomes ----> [... 2]
[...1]] [... 1]]
将轴从0更改为1,导致沿着第一个轴上的序列应用相同的过程:
[[3 5 6 4 1 becomes ----> [[4 0 3 1 2
再次因为最小的元素是1
,它在索引4
,然后是3
在索引0
,然后是4
在索引{{1} },3
位于索引5
,最后1
位于索引6
处最大。
与之前一样,在每个
中重复此过程2
给予
[2 7 4 1 2] ----> [3 0 4 2 1]
[8 6 7 2 1] ----> [4 3 1 2 0]