Python 给定置换数组,查找置换
我有两个numpy整数数组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
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, 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不,它是独一无二的。有什么排列模式吗,比如旋转?