【问题标题】:numpy indexing using argsort result [duplicate]使用argsort结果的numpy索引[重复]
【发布时间】:2018-08-09 06:05:34
【问题描述】:

我得到了一个 numpy 二维数组,以及对应于使用 argsort 获得的前 3 个元素的索引列表。现在,我正在尝试提取与该索引对应的值,但它不起作用。解决方法是什么?。

A = array([[0.19334242, 0.9787497 , 0.41453434, 0.35298119, 0.17943745,
        0.63468207, 0.43840688],
       [0.39811914, 0.68040634, 0.7589702 , 0.3573046 , 0.16365397,
        0.86329535, 0.48559053],
       [0.5848541 , 0.54203383, 0.27262654, 0.21979374, 0.06917679,
        0.10586995, 0.57083441],
       [0.76765549, 0.05703751, 0.83383973, 0.71867625, 0.16338699,
        0.85721418, 0.5953548 ]])

np.flip(A.argsort(),axis=1)[:,0:3]
array([[1, 5, 6],
       [5, 2, 1],
       [0, 6, 1],
       [5, 2, 0]])

得到错误

>>> A[np.flip(A.argsort(),axis=1)[:,0:3]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: index 5 is out of bounds for axis 0 with size 4

【问题讨论】:

  • @hpaulj 是的,我查看了 argsort。我没有得到完全意义上的评论?有没有办法,在二维数组的情况下,我可以直接使用 argosrt 获取值?
  • 前 3 个元素在什么维度?行、列、扁平化A?
  • A[idx] 选择行,而不是行中的元素。
  • 应用索引的方式是out = a[np.arange(a.shape[0])[:,None],idx]。这是来自副本的第二个答案。

标签: arrays python-2.7 numpy indexing


【解决方案1】:
In [22]: A.ravel()[A.argsort(axis=None)[::-1][:3]]
Out[22]: array([ 0.9787497 ,  0.86329535,  0.85721418])

说明

默认情况下,argsort() 沿最后一个轴排序。在您的情况下,您想要对数组的展平版本进行排序,因为您对数组是二维的事实没有任何意义。这通过将axis=None 传递给argsort() 来实现。

由于您获得一维索引,因此您还需要访问扁平版本的数组上的值,这就是 ravel() 所做的。

[::-1] 反转 argsort 数组以首先获取最高值,[:3] 获取前 3 个值。

注意:还有其他可能更有效的方法可以做到这一点,但这是我想到的第一件事。

【讨论】:

  • 我想找出每一行的前 3 个元素。
  • 我认为你应该编辑你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
相关资源
最近更新 更多