带有二维数组的numpy.partition()

时间:2015-05-03 21:16:29

标签: python arrays numpy

numpy.partition()也会对数组元素的内部进行排序。

我一直在尝试根据数组中所有元素的第一个元素进行简单排序。

import numpy as np
a = np.array([[5.2, 4.3], [200.2, 6.2], [1.4, 112.2]])
np.partition(a, (1,a.shape[1]-1), axis = 1)

输出:

array([[   4.3,    5.2],
       [   6.2,  200.2],
       [   1.4,  112.2]])

我不明白np.partition()在这里的工作。有关numpy.partition()的详细信息?

具体来说,我想修改方法的参数以生成以下输出:

array([[   1.4,   112.2],
       [    5.2,    4.3],
       [    200.2,  6.2]])

2 个答案:

答案 0 :(得分:3)

np.partition()确保特定索引处的值与阵列完全排序时的值相同(例如使用np.sort)。 (其他指数的值的顺序不保证是有意义的。)

axis=1参数表示此操作将单独应用于每一行。

此处,您传递的索引为(1, a.shape[1]-1),在这种情况下相当于(1, 1)。重复索引没有特殊含义,因此在每一行中,第二列(索引1)中的值将与每行按排序顺序相同。

现在,当应用该操作时,您会在返回的数组中看到第一行和第二行中的较高值已移至此第二列。第三行已按排序顺序排列,因此不变。

这就是功能的全部内容:NumPy documentation涵盖了一些进一步的细节。如果你感觉特别勇敢,你可以找到实现np.partition()在其所有荣耀here中使用的introselect算法的源代码。

答案 1 :(得分:2)

如果我理解正确,您只想根据第一列中的值对数组中的行进行排序。您可以使用np.argsort

执行此操作
# get an array of indices that will sort the first column in ascending order
order = np.argsort(a[:, 0])

# index into the row dimension of a
a_sorted = a[order]

print(a_sorted)
# [[   1.4  112.2]
#  [   5.2    4.3]
#  [ 200.2    6.2]]

如果您想要部分排序而不是完整排序,可以使用np.argpartition大致相同的方式:

# a slightly larger example array in order to better illustrate what
# argpartition does
b = np.array([[  5.2,   4.3],
              [200.2,   6.2],
              [  3.6,  85.1],
              [  1.4, 112.2],
              [ 12.8,  60.0],
              [  7.6,  23.4]])

# get a set of indices to reorder the rows of `b` such that b[2, 0] is in its
# final 'sorted' position, and all elements smaller or larger than it will be
# placed before and after it respectively
partial_order = np.argpartition(b[:, 0], 2)

# the first (2+1) elements in the first column are guaranteed to be smaller than
# the rest, but apart from that the order is arbitrary
print(b[partial_order])
# [[   1.4  112.2]
#  [   3.6   85.1]
#  [   5.2    4.3]
#  [ 200.2    6.2]
#  [  12.8   60. ]
#  [   7.6   23.4]]