Python Numpy中对称方阵置换的有效方法

Python Numpy中对称方阵置换的有效方法,python,matlab,numpy,Python,Matlab,Numpy,在Numpy中,当处理对称方阵(NxN)其中N>20000时,执行以下操作的最佳方法是什么 >>> a = np.arange(9).reshape([3,3]) >>> a = np.maximum(a, a.T) >>> a array([[0, 3, 6], [3, 4, 7], [6, 7, 8]]) >>> perm = np.random.permutation(3) >>

在Numpy中,当处理对称方阵(
NxN
)其中
N>20000
时,执行以下操作的最佳方法是什么

>>> a = np.arange(9).reshape([3,3])
>>> a = np.maximum(a, a.T)
>>> a
array([[0, 3, 6],
       [3, 4, 7],
       [6, 7, 8]])
>>> perm = np.random.permutation(3)
>>> perm
array([1, 0, 2])
>>> shuffled_arr = a[perm, :][:, perm]
>>> shuffled_arr
array([[4, 3, 7],
       [3, 0, 6],
       [7, 6, 8]])
当N约为19K时,这大约需要6-7秒。虽然Matlab中的相同操作只需不到一秒钟:

perm = randperm(N);
shuffled_arr = arr(perm, perm);
一个索引步骤要快得多:

In [706]: timeit a[perm[:,None],perm]   # same as `np.ix_...`
1 loop, best of 3: 1.88 s per loop

In [707]: timeit a[perm,:][:,perm]
1 loop, best of 3: 8.88 s per loop

In [708]: timeit np.take(np.take(a,perm,0),perm,1)
1 loop, best of 3: 1.41 s per loop

a[perm,perm[:,None]]
属于8s类别。

我会做
arr[np.ix(perm,perm)]
,不过我不知道它是否会更快。@user2357112很高兴知道这一点!它只减少了大约1秒的处理时间(仍然是5-6秒)。您也可以尝试
arr[perm,perm[:,None]]
,但我不知道是否会更快。忽略这个建议。对于一个具有形状(10000,10000)的数组,它所需的时间是arr[np.ix(perm,perm)]的两倍多。请参阅。在您的例子中,
np.take(np.take(a,perm,0),perm,1)
In [706]: timeit a[perm[:,None],perm]   # same as `np.ix_...`
1 loop, best of 3: 1.88 s per loop

In [707]: timeit a[perm,:][:,perm]
1 loop, best of 3: 8.88 s per loop

In [708]: timeit np.take(np.take(a,perm,0),perm,1)
1 loop, best of 3: 1.41 s per loop