python - 如何按第二列对 numpy 二维数组的部分进行排序?

我目前正在使用 python 和 openCV 进行计算机视觉项目。我有一个像这样的二维 numpy 数组:

[100  38  18]
 [134 332  16]
 [136 200  16]
 [136 288  15]
 [138 160  17]
 [138 246  15]
 [140  76  12]
 [140 116  12]
 [142  34  14]

二维数组已按第一列排序。这工作正常。现在我需要按第二列对 3 行的包进行排序。这是我需要达到的结果:

[100  38  18]
 [136 200  16]
 [134 332  16]
 [138 160  17]
 [138 246  15]
 [136 288  15]
 [142  34  14]
 [140  76  12]
 [140 116  12]

我怎样才能做到这一点?

回答1

考虑将数据重塑为 3d,然后使用 for 循环对每个数组进行排序并转换回 np.array

np.array([sorted(i, key = lambda x: x[1]) for i in ar.reshape(3, -1, ar.shape[1])]).reshape(ar.shape)
 
array([[100,  38,  18],
       [136, 200,  16],
       [134, 332,  16],
       [138, 160,  17],
       [138, 246,  15],
       [136, 288,  15],
       [142,  34,  14],
       [140,  76,  12],
       [140, 116,  12]])

回答2

仅通过 NumPy,而不是循环:

sort_ = np.argsort(np.split(a[:, 1], a.shape[0] // 3))
# [[0 2 1]
#  [1 2 0]
#  [2 0 1]]

sort_ += np.linspace(0, a.shape[0] - 3, a.shape[0] // 3, dtype=np.int64)[:, None]
# [[0 2 1]
#  [4 5 3]
#  [8 6 7]]

a = a[sort_.ravel()]

回答3

除了使用循环,我别无他法

A 成为你的数组

output = np.zeros((0, 3))
for i in range(int(A.shape[0]/3)):
    output = np.vstack((output, A[3*i + np.argsort(A[3*i:3*(i+1), 1])]))

注意:我假设您的数组有许多行是 3 的倍数

相似文章

最新文章