首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy中对称方阵置换的有效方法

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

Stack Overflow用户
提问于 2016-10-06 23:02:50
回答 1查看 310关注 0票数 1

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

代码语言:javascript
复制
>>> 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中的相同操作所需时间不到1秒钟:

代码语言:javascript
复制
perm = randperm(N);
shuffled_arr = arr(perm, perm);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-07 02:02:05

代码语言:javascript
复制
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)

一个索引步骤要快得多:

代码语言:javascript
复制
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类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39906919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档