首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在numpy中反转排列数组

如何在numpy中反转排列数组
EN

Stack Overflow用户
提问于 2012-07-25 20:20:28
回答 2查看 12.2K关注 0票数 38

给定一个自索引(不确定这是否是正确的术语) numpy数组,例如:

a = np.array([3, 2, 0, 1])

这表示此permutation (=>是一个箭头):

0 => 3
1 => 2
2 => 0
3 => 1

我试图创建一个表示逆变换的数组,而不是在python中“手动”执行,也就是说,我想要一个纯粹的numpy解决方案。在上面的例子中,我想要的结果是:

array([2, 3, 1, 0])

这相当于

0 <= 3                0 => 2
1 <= 2       or       1 => 3
2 <= 0                2 => 1
3 <= 1                3 => 0

这看起来很简单,但我就是想不出该怎么做。我试着用谷歌搜索,但没有找到任何相关的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-25 20:40:26

np.arange(n)的置换p的逆数组是对p进行排序的索引数组s,即

p[s] == np.arange(n)

一定都是真的。这样的s正是np.argsort返回的内容:

>>> p = np.array([3, 2, 0, 1])
>>> np.argsort(p)
array([2, 3, 1, 0])
>>> p[np.argsort(p)]
array([0, 1, 2, 3])
票数 36
EN

Stack Overflow用户

发布于 2012-07-25 21:52:06

我想为孩子们的正确答案提供一点背景知识。当您使用permutation by a matrix的表示形式时,可以找到argsort正确的原因。置换矩阵P的数学优势在于矩阵“对向量进行运算”,即置换矩阵乘以向量对向量进行置换。

你的排列看起来像:

import numpy as np
a   = np.array([3,2,0,1])
N   = a.size
rows = np.arange(N)
P   = np.zeros((N,N),dtype=int)
P[rows,a] = 1

[[0 0 0 1]
 [0 0 1 0]
 [1 0 0 0]
 [0 1 0 0]]

给定一个置换矩阵,我们可以通过乘以它的逆P^-1来“撤销”乘法。置换矩阵的美妙之处在于它们是正交的,因此P*P^(-1)=I,或者换句话说P(-1)=P^T,逆矩阵是转置矩阵。这意味着我们可以利用转置矩阵的索引来找到您的反转排列向量:

inv_a = np.where(P.T)[1]
[2 3 1 0]

仔细想想,这与查找对P列进行排序的索引是完全相同的!

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

https://stackoverflow.com/questions/11649577

复制
相关文章

相似问题

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