如何按第二列对 numpy 二维数组的部分进行排序?
How to sort parts of a numpy 2D array by second column?
我目前正在使用 python 和 openCV 进行计算机视觉项目。
我有一个像这样的 2D 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]
我怎样才能做到这一点?
除了使用循环,我看不到其他方法
让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 的倍数
考虑将数据重塑为 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]])
仅通过 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()]
我目前正在使用 python 和 openCV 进行计算机视觉项目。 我有一个像这样的 2D 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]
我怎样才能做到这一点?
除了使用循环,我看不到其他方法
让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 的倍数
考虑将数据重塑为 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]])
仅通过 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()]