按列和对数组进行排序,并使用Numpy排除每列的最大和



我想按列和对数组进行排序,删除每列中最大的元素,然后继续排序。

#sorted by sum of columns
def sorting(a):
b = np.sum(a, axis = 0)
idx = b.argsort()
a = np.take(a, idx, axis=1)
return a
arr = [[1,2,3,8], [3,0,2,1],[5, 4, 25, 67], [11, 1, 6, 10]]
print(sorting(arr))
Here is the output: 
[[ 2  1  3  8]
[ 0  3  2  1]
[ 4  5 25 67]
[ 1 11  6 10]]

我能够找到每列及其索引的最大值,但如果不删除整行/整列,我就无法删除它们。请帮帮我,我是新手!!!

虽然不是很优雅,但实现这一点的一种方法是使用广播和高级索引:

import numpy as np
arr = np.array([[1,2,3,8], [3,0,2,1],[5, 4, 25, 67], [11, 1, 6, 10]])

首先获取按列和排序的中间数组。

arr1 = arr[:, arr.sum(axis = 0).argsort()]
print(arr1)
# array([[ 2,  1,  3,  8],
#        [ 0,  3,  2,  1],
#        [ 4,  5, 25, 67],
#        [ 1, 11,  6, 10]])

接下来获取每列中最大值的出现位置。

idx = arr1.argmax(axis = 0)
print(idx)
# array([2, 3, 2, 2])

现在准备行和列索引数组以从arr1进行切片。注意,用于计算rows的行本质上为上述idx中的每个元素执行{0,1,2,3}(通常为arr中的行数(的集合差,并将它们沿着rows矩阵的列存储。

k = np.arange(arr1.shape[0]) # original number of rows
rows = np.nonzero(k != idx[:, None])[1].reshape(-1, arr1.shape[0] - 1).T
cols = np.arange(arr1.shape[1])
print(rows)
# array([[0, 0, 0, 0],
#        [1, 1, 1, 1],
#        [3, 2, 3, 3]])

注意,cols将被广播成rows的形状,同时由它们对arr1进行索引。根据您的理解,cols将与rows:兼容

print(np.broadcast_to(cols, rows.shape))
# array([[0, 1, 2, 3],
#        [0, 1, 2, 3],
#        [0, 1, 2, 3]])

基本上,当你(花式(通过它们索引arr1时,你会得到第0列的第0、1和3行;第0行、第1行和第2行的第1列,依此类推。希望你能理解。

arr2 = arr1[rows, cols]
print(arr2)
# array([[ 2,  1,  3,  8],
#        [ 0,  3,  2,  1],
#        [ 1,  5,  6, 10]])

您可以编写一个简单的函数来组成这些步骤,以便执行乘法运算。

最新更新