Python 给定置换数组,查找置换

Python 给定置换数组,查找置换,python,arrays,numpy,permutation,Python,Arrays,Numpy,Permutation,我有两个numpy整数数组 导入numpy a=numpy.array([1,3,5,0]) b=numpy.array([3,5,0,1]) 我知道这是彼此的排列。我如何找到排列,即整数数组I a[i] == b ??Explicitfor循环可以在整个数组中进行比较,但效率似乎很低 如果行数组的排列像 导入numpy a=numpy.array([ [1, 2], [3, 7], [5, 12], [0, 4], # ... ]) b=numpy.array([ [3, 7], [5,

我有两个numpy整数数组

导入numpy
a=numpy.array([1,3,5,0])
b=numpy.array([3,5,0,1])
我知道这是彼此的排列。我如何找到排列,即整数数组
I

a[i] == b
??Explicit
for
循环可以在整个数组中进行比较,但效率似乎很低

如果行数组的排列像

导入numpy
a=numpy.array([
[1, 2],
[3, 7],
[5, 12],
[0, 4],
# ...
])
b=numpy.array([
[3, 7],
[5, 12],
[0, 4], 
[1, 2],
# ...
])
这里有一个打开的
1D
-用于
2D
阵列的视图-

# https://stackoverflow.com/a/45313353/ @Divakar
def view1D(a, b): # a, b are arrays
    a = np.ascontiguousarray(a)
    b = np.ascontiguousarray(b)
    void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
    return a.view(void_dt).ravel(),  b.view(void_dt).ravel()

A,B = view1D(a,b)
sidx = A.argsort()
idx = sidx[np.searchsorted(A,B,sorter=sidx)]
对于
1D
输入数组,我们可以直接将
a
b
分别作为
a
b
输入

或者,对于正整数,我们可以使用降维,保持其余部分与前面相同-

s = np.r_[1,a[:,:-1].max(0)+1]
A,B = a.dot(s),b.dot(s)
或者使用
np.ravel\u multi\u index
在二维网格上进行映射-

shp = a.max(0)+1
A,B = np.ravel_multi_index(a.T,shp),np.ravel_multi_index(b.T,shp)
另一种方法是使用相同的
网格映射
技术,使用
稀疏矩阵
计算正整数-

from scipy.sparse import csr_matrix

R = np.arange(1,len(a)+1)
c = csr_matrix((R, a.T), shape=a.max(0)+1)
idx = c[b[:,0],b[:,1]].A1-1
这是一个关于
1D
的视图,用于
2D
阵列-

# https://stackoverflow.com/a/45313353/ @Divakar
def view1D(a, b): # a, b are arrays
    a = np.ascontiguousarray(a)
    b = np.ascontiguousarray(b)
    void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
    return a.view(void_dt).ravel(),  b.view(void_dt).ravel()

A,B = view1D(a,b)
sidx = A.argsort()
idx = sidx[np.searchsorted(A,B,sorter=sidx)]
对于
1D
输入数组,我们可以直接将
a
b
分别作为
a
b
输入

或者,对于正整数,我们可以使用降维,保持其余部分与前面相同-

s = np.r_[1,a[:,:-1].max(0)+1]
A,B = a.dot(s),b.dot(s)
或者使用
np.ravel\u multi\u index
在二维网格上进行映射-

shp = a.max(0)+1
A,B = np.ravel_multi_index(a.T,shp),np.ravel_multi_index(b.T,shp)
另一种方法是使用相同的
网格映射
技术,使用
稀疏矩阵
计算正整数-

from scipy.sparse import csr_matrix

R = np.arange(1,len(a)+1)
c = csr_matrix((R, a.T), shape=a.max(0)+1)
idx = c[b[:,0],b[:,1]].A1-1

这里有一个使用argsort两次。它似乎比@Divakar快了几个百分点:


这里有一个使用argsort两次。它似乎比@Divakar快了几个百分点:


数组的典型大小是什么?输入数组是否包含重复的数字?@WarrenWeckesser几十到几千。@GZ不,它是唯一的。是否有任何排列模式,例如旋转?数组的典型大小是什么?输入数组是否包含重复的数字?@WarrenWeckesser几十到几千。@GZ不,它是独一无二的。有什么排列模式吗,比如旋转?