我正在尝试使用argsort函数对numpy数组进行排序。
不幸的是,这不起作用,我不明白为什么:(
代码是:
import numpy as np
distance = np.array([38.26, 33.01, 32.33, 30.77, 37.96, 44.37, 32.72, 36.56,
27.77, 33.62, 42.85, 34.6 , 32.04, 27.49, 49.64, 51.85,
44.37, 38.26, 46.93, 40.45, 40.72, 39.7 , 34.12, 36.9 ,
34.6 , 34. , 36.56, 39.29, 38.6 , 32.33, 32.65, 40.72,
43.85, 47.89, 33.62, 35.24, 42.5 , 36.97, 28.36, 37.57,
37.25, 25.54, 29.6 , 37.25, 40.45, 32.04, 40.45, 31.4 ,
41.78, 35.89, 59.24, 51.2 , 57.22, 35.54, 50.09, 40.33,
50.58, 29.77, 51.97, 34.33, 29. , 43.81, 40.84, 45.62,
39.77, 54.5 , 40.36, 40.93, 43.28, 37.61, 45.05, 45.05,
45.94, 45.05, 49.37, 52.56, 54.08, 53.89, 44.41, 39.25,
36.01, 36.01, 40.93, 43.29, 38.16, 47.56, 54.5 , 44.98,
40.36, 36.5 , 37.01, 46.21, 40.4 , 30.29, 38.65, 41.49,
40.9 , 46.85, 32.26, 40.33, 50.58, 40.93, 59.41, 48.1 ,
51.25, 66.76, 30.26, 61.7 , 51.14, 64.8 , 52.49, 48.25,
55.24, 38.74, 41.48, 51.2 , 51.25, 73.73, 66.05, 40.84,
57.85, 39.2 , 67.13, 46.98, 55.78, 62.08, 46.28, 46.21,
48.8 , 60.84, 62.6 , 76.85, 48.8 , 47.53, 43.97, 68.29,
51.25, 50.57, 45. , 57.22, 54.5 , 57.22, 40.93, 56.48,
55.78, 53.89, 45.94, 51.25, 50. , 43.81])
要进行调试,我将使用argsort打印距离数组:
print np.array(zip(distance, distance.argsort()))
我得到的就是这个。它看起来不对,因为例如30.77小于32.33,但32.33标记为8和30.77标记为38.我做错了什么?
[[ 38.26 41. ]
[ 33.01 13. ]
[ 32.33 8. ]
[ 30.77 38. ]
[ 37.96 60. ]
[ 44.37 42. ]
[ 32.72 57. ]
[ 36.56 106. ]
[ 27.77 93. ]
[ 33.62 3. ]
[ 42.85 47. ]
[ 34.6 45. ]
[ 32.04 12. ]
[ 27.49 98. ]
[ 49.64 2. ]
[ 51.85 29. ]
[ 44.37 30. ]
[ 38.26 6. ]
[ 46.93 1. ]
[ 40.45 9. ]
[ 40.72 34. ]
[ 39.7 25. ]
[ 34.12 22. ]
[ 36.9 59. ]
[ 34.6 24. ]
[ 34. 11. ]
[ 36.56 35. ]
[ 39.29 53. ]
[ 38.6 49. ]
[ 32.33 80. ]
[ 32.65 81. ]
[ 40.72 89. ]
[ 43.85 26. ]
[ 47.89 7. ]
[ 33.62 23. ]
[ 35.24 37. ]
[ 42.5 90. ]
[ 36.97 43. ]
[ 28.36 40. ]
[ 37.57 39. ]
[ 37.25 69. ]
[ 25.54 4. ]
[ 29.6 84. ]
[ 37.25 0. ]
[ 40.45 17. ]
[ 32.04 28. ]
[ 40.45 94. ]
[ 31.4 113. ]
[ 41.78 121. ]
[ 35.89 79. ]
[ 59.24 27. ]
[ 51.2 21. ]
[ 57.22 64. ]
[ 35.54 99. ]
[ 50.09 55. ]
[ 40.33 88. ]
[ 50.58 66. ]
[ 29.77 92. ]
[ 51.97 46. ]
[ 34.33 44. ]
[ 29. 19. ]
[ 43.81 20. ]
[ 40.84 31. ]
[ 45.62 62. ]
[ 39.77 119. ]
[ 54.5 96. ]
[ 40.36 67. ]
[ 40.93 101. ]
[ 43.28 142. ]
[ 37.61 82. ]
[ 45.05 114. ]
[ 45.05 95. ]
[ 45.94 48. ]
[ 45.05 36. ]
[ 49.37 10. ]
[ 52.56 68. ]
[ 54.08 83. ]
[ 53.89 149. ]
[ 44.41 61. ]
[ 39.25 32. ]
[ 36.01 134. ]
[ 36.01 5. ]
[ 40.93 16. ]
[ 43.29 78. ]
[ 38.16 87. ]
[ 47.56 138. ]
[ 54.5 73. ]
[ 44.98 71. ]
[ 40.36 70. ]
[ 36.5 63. ]
[ 37.01 146. ]
[ 46.21 72. ]
[ 40.4 127. ]
[ 30.29 91. ]
[ 38.65 126. ]
[ 41.49 97. ]
[ 40.9 18. ]
[ 46.85 123. ]
[ 32.26 133. ]
[ 40.33 85. ]
[ 50.58 33. ]
[ 40.93 103. ]
[ 59.41 111. ]
[ 48.1 132. ]
[ 51.25 128. ]
[ 66.76 74. ]
[ 30.26 14. ]
[ 61.7 148. ]
[ 51.14 54. ]
[ 64.8 137. ]
[ 52.49 100. ]
[ 48.25 56. ]
[ 55.24 108. ]
[ 38.74 115. ]
[ 41.48 51. ]
[ 51.2 104. ]
[ 51.25 136. ]
[ 73.73 116. ]
[ 66.05 147. ]
[ 40.84 15. ]
[ 57.85 58. ]
[ 39.2 110. ]
[ 67.13 75. ]
[ 46.98 145. ]
[ 55.78 77. ]
[ 62.08 76. ]
[ 46.28 65. ]
[ 46.21 140. ]
[ 48.8 86. ]
[ 60.84 112. ]
[ 62.6 144. ]
[ 76.85 124. ]
[ 48.8 143. ]
[ 47.53 139. ]
[ 43.97 141. ]
[ 68.29 52. ]
[ 51.25 120. ]
[ 50.57 50. ]
[ 45. 102. ]
[ 57.22 129. ]
[ 54.5 107. ]
[ 57.22 125. ]
[ 40.93 130. ]
[ 56.48 109. ]
[ 55.78 118. ]
[ 53.89 105. ]
[ 45.94 122. ]
[ 51.25 135. ]
[ 50. 117. ]
[ 43.81 131. ]]
答案 0 :(得分:5)
distance.argsort()
返回索引数组。 ith
索引不告诉您ith
中distance
元素的排名。相反,ith
索引会告诉您排序数组中的ith
元素为distance[i]
。
换句话说,
idx = distance.argsort()
assert (distance[idx] == np.sort(distance)).all()
考虑这个小例子from the docs:
In [236]: x = np.array([3, 1, 2])
In [237]: np.argsort(x)
Out[237]: array([1, 2, 0])
In [238]: x[np.argsort(x)]
Out[238]: array([1, 2, 3])
In [239]: x[1], x[2], x[0]
Out[239]: (1, 2, 3)
两次调用argsort
会为您提供ith
中distance
元素的排名:
In [240]: np.argsort(np.argsort(x))
Out[240]: array([2, 0, 1])
了解其工作原理可以很好地检验您对argsort
的理解。但是,调用argsort
两次以查找排名效率低下。特别是对于较大的数组there are other, faster, ways来查找排名。
答案 1 :(得分:0)
以下适用于我:
distance.sort()
返回
array([ 25.54, 27.49, 27.77, 28.36, 29. , 29.6 , 29.77, 30.26,
30.29, 30.77, 31.4 , 32.04, 32.04, 32.26, 32.33, 32.33,
32.65, 32.72, 33.01, 33.62, 33.62, 34. , 34.12, 34.33,
34.6 , 34.6 , 35.24, 35.54, 35.89, 36.01, 36.01, 36.5 ,
36.56, 36.56, 36.9 , 36.97, 37.01, 37.25, 37.25, 37.57,
37.61, 37.96, 38.16, 38.26, 38.26, 38.6 , 38.65, 38.74,
39.2 , 39.25, 39.29, 39.7 , 39.77, 40.33, 40.33, 40.36,
40.36, 40.4 , 40.45, 40.45, 40.45, 40.72, 40.72, 40.84,
40.84, 40.9 , 40.93, 40.93, 40.93, 40.93, 41.48, 41.49,
41.78, 42.5 , 42.85, 43.28, 43.29, 43.81, 43.81, 43.85,
43.97, 44.37, 44.37, 44.41, 44.98, 45. , 45.05, 45.05,
45.05, 45.62, 45.94, 45.94, 46.21, 46.21, 46.28, 46.85,
46.93, 46.98, 47.53, 47.56, 47.89, 48.1 , 48.25, 48.8 ,
48.8 , 49.37, 49.64, 50. , 50.09, 50.57, 50.58, 50.58,
51.14, 51.2 , 51.2 , 51.25, 51.25, 51.25, 51.25, 51.85,
51.97, 52.49, 52.56, 53.89, 53.89, 54.08, 54.5 , 54.5 ,
54.5 , 55.24, 55.78, 55.78, 56.48, 57.22, 57.22, 57.22,
57.85, 59.24, 59.41, 60.84, 61.7 , 62.08, 62.6 , 64.8 ,
66.05, 66.76, 67.13, 68.29, 73.73, 76.85])