首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对NumPy数组进行排序,并与其一起排列另一个数组

对NumPy数组进行排序,并与其一起排列另一个数组
EN

Stack Overflow用户
提问于 2016-02-05 09:26:51
回答 2查看 2.1K关注 0票数 7

我有两个numpy数组,第一个是一维的A,第二个是B,在我所想到的应用程序中是二维的,但实际上可以有任何维度。B的每一个索引都与A的单个索引覆盖相同的范围。

现在,我想对A进行排序(按降序排列),但希望与其一起对B的每个维度进行排序。从数学上讲,如果P是排序A的置换矩阵,我想根据np.dot(P, np.dot(B, P.T))变换B。例如,考虑以下示例,其中排序巧合地对应于倒序:

代码语言:javascript
运行
复制
In [1]: import numpy as np

In [2]: A = np.array([1,2,3])

In [3]: B = np.random.rand(3,3); B
Out[3]: 
array([[ 0.67402953,  0.45017072,  0.24324747],
       [ 0.40559793,  0.79007712,  0.94247771],
       [ 0.47477422,  0.27599007,  0.13941255]])

In [4]: # desired output:

In [5]: A[::-1]
Out[5]: array([3, 2, 1])

In [6]: B[::-1,::-1]
Out[6]: 
array([[ 0.13941255,  0.27599007,  0.47477422],
       [ 0.94247771,  0.79007712,  0.40559793],
       [ 0.24324747,  0.45017072,  0.67402953]])

我想到的应用是使用np.linalg.eig获得非对称矩阵的特征值和特征向量(相对于eigheig不保证特征值的任何排序),根据绝对值对它们进行排序,并截断空间。这将有利于改变矩阵的各分量,保持特征向量和特征值,并通过切片进行截断。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-05 09:38:41

您可以使用np.argsort获取A的排序索引。然后可以使用这些索引重新排列B

不完全是你想要重新排列B.

代码语言:javascript
运行
复制
p = np.argsort(A)

B[:, p][p, :]  # rearrange rows and column of B
B.transpose(p)  # rearrange dimensions of B

如果你想根据特征值排序特征向量,你只需要重新排列特征向量的列:(而且,如果你得到复杂的特征值,使用绝对值也是有意义的)

代码语言:javascript
运行
复制
e, v = eig(x)
p = np.argsort(np.abs(e))[::-1]  # descending order
v = v[:, p]
票数 7
EN

Stack Overflow用户

发布于 2016-02-05 09:37:12

您可以使用numpy.argsort获取索引映射。例如:

代码语言:javascript
运行
复制
test=np.array([2,1,3])
test_array=np.array([[2,3,4],[1,2,3]])
rearranged_array=test_array[:,test.argsort()]

在这里,test.argsort()生成[1,0,2]

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35220464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档