我想按列和对数组进行排序,删除每列中最大的元素,然后继续排序。
#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]])
您可以编写一个简单的函数来组成这些步骤,以便执行乘法运算。