给定一个自索引(不确定这是否是正确的术语) 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
这看起来很简单,但我就是想不出该怎么做。我试着用谷歌搜索,但没有找到任何相关的东西。
发布于 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])
发布于 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
列进行排序的索引是完全相同的!
https://stackoverflow.com/questions/11649577
复制相似问题