【问题标题】:numpy: applying argsort to an arraynumpy:将argsort应用于数组
【发布时间】:2012-06-28 21:55:41
【问题描述】:

argsort() 函数返回一个索引矩阵,可用于索引原始数组,以便结果与sort() 结果匹配。

有没有办法应用这些索引?我有两个数组,一个是用于获取排序顺序的数组,另一个是一些关联数据。

我想计算assoc_data[array1.argsort()],但这似乎不起作用。

这是一个例子:

z=array([1,2,3,4,5,6,7])
z2=array([z,z*z-7])
i=z2.argsort()

z2=array([[ 1,  2,  3,  4,  5,  6,  7],
          [-6, -3,  2,  9, 18, 29, 42]])
i =array([[1, 1, 1, 0, 0, 0, 0],
          [0, 0, 0, 1, 1, 1, 1]])

我想将 i 应用于 z2(或具有关联数据的另一个数组),但我不知道该怎么做。

【问题讨论】:

  • 你想沿哪个轴排序?

标签: python arrays numpy


【解决方案1】:

这可能是矫枉过正,但这将在第一种情况下工作:

import numpy as np
axis = 0
index = list(np.ix_(*[np.arange(i) for i in z2.shape]))
index[axis] = z2.argsort(axis)
z2[index]

# Or if you only need the 3d case you can use np.ogrid.

axis = 0
index = np.ogrid[:z2.shape[0], :z2.shape[1], :z2.shape[2]]
index[axis] = z2.argsort(axis)
z2[index]

【讨论】:

  • 奇怪的是,一年后我又需要这个,在寻找如何做到这一点时,我遇到了我之前问过的问题......我终于明白了它的作用。顺便说一句,这看起来并不过分。
【解决方案2】:

你很幸运,我刚刚获得了 numpyology 的硕士学位。

>>> def apply_argsort(a, axis=-1):
...     i = list(np.ogrid[[slice(x) for x in a.shape]])
...     i[axis] = a.argsort(axis)
...     return a[i]
... 
>>> a = np.array([[1,2,3,4,5,6,7],[-6,-3,2,9,18,29,42]])
>>> apply_argsort(a,0)
array([[-6, -3,  2,  4,  5,  6,  7],
       [ 1,  2,  3,  9, 18, 29, 42]])

有关发生了什么的解释,请参阅我对this question 的回答。

【讨论】:

    【解决方案3】:

    使用np.take_along_axis

    np.take_along_axis(z2, i, axis=1)
    Out[31]: 
    array([[ 1,  2,  3,  4,  5,  6,  7],
           [-6, -3,  2,  9, 18, 29, 42]])
    

    【讨论】:

    • 这不是我要找的答案,但如果调用正确的话,np.take_along.axis 确实可以用于此目的。
    【解决方案4】:

    啊哈,想通了。

    In [274]: z2[i,range(z2.shape[1])]
    Out[274]:
    array([[-6, -3,  2,  4,  5,  6,  7],
           [ 1,  2,  3,  9, 18, 29, 42]])
    

    【讨论】:

    • 另外你没有说我是谁 ;)
    • 糟糕,很抱歉,您的问题中有两个 i,而我正在查看“错误”一个(第一个,插入您的答案时不起作用)
    猜你喜欢
    • 2013-05-16
    • 1970-01-01
    • 2013-11-18
    • 2019-07-25
    • 1970-01-01
    • 2014-04-20
    • 2018-12-21
    • 1970-01-01
    • 2017-07-10
    相关资源
    最近更新 更多