python - 在 Numpy 中排列对称方阵的有效方法

标签 python matlab numpy

处理对称方阵(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 类别。

关于python - 在 Numpy 中排列对称方阵的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39906919/

相关文章:

python - 首选项窗口在关闭时销毁 - Glade、Gtk、Python

python - 在 Apache Cassandra 中混合执行两个 Python 脚本和 DatastaxBulk 加载器脚本以加载到 .csv

matlab - 在 Matlab 中与矩阵索引的向量混淆

python - 如何使用 fft 在频域中向正弦波添加相移?

python - 转置大数组而不加载到内存中

python - 使用 Numpy 迭代 DataFrame 行以创建新列

python - 根据关键行查找跨轴的第一个重复项

python - 带有seaborn clustermap的下三角掩码

matlab - 如何在matlab中更改标题栏上的图标?

java - 在自定义工具箱的 Matlab Simulink block 内存储自定义 java 对象