Python 2.7 使用Numpy.argpartition按排序顺序获取每列的k-最小值

Python 2.7 使用Numpy.argpartition按排序顺序获取每列的k-最小值,python-2.7,numpy,Python 2.7,Numpy,使用np.argpartition,它不会对整个数组进行排序。它只保证第k个元素处于排序位置,并且所有较小的元素都将在它之前移动。因此,前k个元素将是k个最小元素 >>> num = 3 >>> myBigArray=np.array([[1,3,2,5,7,0],[14,15,6,5,7,0],[17,8,9,5,7,0]]) >>> top = np.argpartition(myBigArray, num, axis=1)[:, :nu

使用np.argpartition,它不会对整个数组进行排序。它只保证第k个元素处于排序位置,并且所有较小的元素都将在它之前移动。因此,前k个元素将是k个最小元素

>>> num = 3
>>> myBigArray=np.array([[1,3,2,5,7,0],[14,15,6,5,7,0],[17,8,9,5,7,0]])
>>> top = np.argpartition(myBigArray, num, axis=1)[:, :num]
>>> print top
[[5 0 2]
[3 5 2]
[5 3 4]]
>>> myBigArray[np.arange(myBigArray.shape[0])[:, None], top]
[[0 1 2]
[5 0 6]
[0 5 7]]
这将返回每列的k-最小值。请注意,这些元素可能不是按排序顺序排列的。我使用此方法是因为以这种方式获取按排序顺序排列的top-k元素需要O(n+k log k)时间 我希望在不增加时间复杂度的情况下,按排序顺序获得每列的k-最小值。
有什么建议吗

一点间接索引就可以了。请注意,我是从你开始写行开始写行的

fdim = np.arange(3)[:, None]
so = np.argsort(myBigArray[fdim, top], axis=-1)
tops = top[fdim, so]
myBigArray[fdim, tops]
# array([[0, 1, 2],
         [0, 5, 6],
         [0, 5, 7]])

关于
argpartition
range
参数的注释:
我强烈怀疑它不是O(n+k log k);在任何情况下,它通常比手动
argpartition
+
argsort
慢几倍。请参见

一点间接索引就可以了。请注意,我是从你开始写行开始写行的

fdim = np.arange(3)[:, None]
so = np.argsort(myBigArray[fdim, top], axis=-1)
tops = top[fdim, so]
myBigArray[fdim, tops]
# array([[0, 1, 2],
         [0, 5, 6],
         [0, 5, 7]])
关于
argpartition
range
参数的注释:
我强烈怀疑它不是O(n+k log k);在任何情况下,它通常比手动
argpartition
+
argsort
慢几倍。请参见要使用和维护排序顺序,我们需要将这些元素范围用作
range(k)
,而不是只输入标量
kth
参数-

idx = np.argpartition(myBigArray, range(num), axis=1)[:, :num]
out = myBigArray[np.arange(idx.shape[0])[:,None], idx]
为了使用和维护排序顺序,我们需要将这些元素范围用作
range(k)
,而不是只输入标量
kth
param-

idx = np.argpartition(myBigArray, range(num), axis=1)[:, :num]
out = myBigArray[np.arange(idx.shape[0])[:,None], idx]

您可以使用与在行中使用的完全相同的技巧;结合@Divakar的排序技巧,这就变成了

In [42]: num = 2

In [43]: myBigArray[np.argpartition(myBigArray, range(num), axis=0)[:num, :], np.arange(myBigArray.shape[1])[None, :]]
Out[43]: 
array([[ 1,  3,  2,  5,  7,  0],
       [14,  8,  6,  5,  7,  0]])

您可以使用与在行中使用的完全相同的技巧;结合@Divakar的排序技巧,这就变成了

In [42]: num = 2

In [43]: myBigArray[np.argpartition(myBigArray, range(num), axis=0)[:num, :], np.arange(myBigArray.shape[1])[None, :]]
Out[43]: 
array([[ 1,  3,  2,  5,  7,  0],
       [14,  8,  6,  5,  7,  0]])

你的问题是如何从最小的k到最大的(顶部?)k?在您的示例中,您似乎已经处理了最小的情况。或者问题是如何从行到列?不,我想按排序顺序得到每列的k-最小值。你的问题是如何从最小的k到最大的(顶部?)k?在您的示例中,您似乎已经处理了最小的情况。或者问题是如何从行到列?不,我想按排序顺序获得每列的k-最小值。任何使用np.argpartition的解决方案???@RajaHammadFarooq它使用
argpartition
;它在你的第三行之后开始。我的意思是它意味着包括前三行。任何使用np.argpartition的解决方案???@RajaHammadFarooq它使用
argpartition
;它在你的第三行之后开始。我的意思是它应该包括你的前三行。