假设我有一个这样的数组:
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中按最大到最小列值重新排列数组?在上面的示例中,column [0]将保留在原位置,column [1]和column [2]将切换位置。
答案 0 :(得分:3)
您可以在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.]])
答案 1 :(得分:1)
使用np.sum
和np.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.]])
答案 2 :(得分:1)
以这种方式交换最后两列:
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]
。
这将为您提供所有列的总和:
a.sum(axis=0) # array([16., 7., 10.])
然后,您将获得用于排序的索引:
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)))]
答案 3 :(得分:0)
arr = np.array([[1., 1., 0.],
[0., 4., 0.],
[8., 0., 8.],
[0., 0., 0.],
[5., 0., 0.],
[2., 2., 2.]])
perm = np.flip(np.argsort(np.sum(arr, axis=0)))
result = a[:, perm]
求和;然后获得对总和进行排序的排列(索引数组)。 argsort
以升序排序,因此请颠倒排列,以使索引从最高总和到最低。最后,通过相同的排列对原始数组重新排序。
答案 4 :(得分:0)
您可以执行以下操作:
def main():
a = np.array([[1., 1., 0.],
[0., 4., 0.],
[8., 0., 8.],
[0., 0., 0.],
[5., 0., 0.],
[2., 2., 2.]])
col_sum = np.sum(a, axis=0)
sort_index = np.argsort(-col_sum) # index sort in descending order
out_matrix = a[:, sort_index]
print(out_matrix)
我认为必须要有一个新实例(out_matrix),因为您不能真正地就地切换列。
答案 5 :(得分:0)
或者您可以使用pandas
:
>>> import pandas as pd, numpy as np
>>> arr=np.array([[1., 1., 0.],
[0., 4., 0.],
[8., 0., 8.],
[0., 0., 0.],
[5., 0., 0.],
[2., 2., 2.]])
>>> df=pd.DataFrame(arr)
>>> df.sort_index(axis=1).values
array([[ 1., 1., 0.],
[ 0., 4., 0.],
[ 8., 0., 8.],
[ 0., 0., 0.],
[ 5., 0., 0.],
[ 2., 2., 2.]])
>>>