在处理对称方阵 (NxN
)其中N > 20000
时,在Numpy中执行以下操作的最佳方法是什么?
>>> 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 [703]: N=10000
In [704]: a=np.arange(N*N).reshape(N,N);a=np.maximum(a, a.T)
In [705]: perm=np.random.permutation(N)
一个索引步骤相当快:
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类