基于和对数组列排序

2024-04-19 18:31:31 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这样一个数组:

np.array([1., 1., 0.],
       [0., 4., 0.],
       [8., 0., 8.],
       [0., 0., 0.],
       [5., 0., 0.],
       [2., 2., 2.]])

[0]列和为16,列[1]到6,列[2]到10。在

如何在Numpy中有效地按列值从大到小重新排列数组?在上面的例子中,列[0]将保持不变,列[1]和列[2]将切换位置。在


Tags: numpynp数组array例子列值
3条回答

交换最后两列的方法如下:

a = np.array([[1., 1., 0.],
             [0., 4., 0.],
             [8., 0., 8.],
             [0., 0., 0.],
             [5., 0., 0.],
             [2., 2., 2.]])

result = a[:, [0, 2, 1]]

因此,您需要根据列和计算这些索引[0, 2, 1]。在

这将得到所有列的总和:

^{pr2}$

从中可以得到排序的索引:

np.argsort(np.array([16.,  7., 10.]))   # [1, 2, 0]

您需要将其翻转以获得从最高到最低的顺序:

np.flip([1, 2, 0])   # [0, 2, 1]

所以,总而言之,就是:

result = a[:, np.flip(np.argsort(a.sum(axis=0)))]

您可以尝试sum沿着axis=0使用argsort,然后反转数组并使用:

a[:,np.argsort(a.sum(axis=0))[::-1]]

array([[1., 0., 1.],
       [0., 0., 4.],
       [8., 8., 0.],
       [0., 0., 0.],
       [5., 0., 0.],
       [2., 2., 2.]])

使用np.sumnp.argsort的组合可以实现以下目的:

x = np.array([[1., 1., 0.],[0., 4., 0.],[8., 0., 8.],[0., 0., 0.],[5., 0., 0.],[2., 2., 2.]])
x[:, np.argsort(-np.sum(x, 0))]
array([[ 1.,  0.,  1.],
       [ 0.,  0.,  4.],
       [ 8.,  8.,  0.],
       [ 0.,  0.,  0.],
       [ 5.,  0.,  0.],
       [ 2.,  2.,  2.]])

相关问题 更多 >