小编jjg*_*ngs的帖子

有效地重塑numpy数组

我正在使用 NumPy 数组。

我有一个2N长度向量D,想将它的一部分重塑为一个N x N数组C

现在这段代码做了我想要的,但对于更大的来说是一个瓶颈N

``

import numpy as np
M = 1000
t = np.arange(M)
D = np.sin(t)    # initial vector is a sin() function
N = M / 2
C = np.zeros((N,N))
for a in xrange(N):
    for b in xrange(N):
        C[a,b] = D[N + a - b]
Run Code Online (Sandbox Code Playgroud)

``

一旦C由我继续前进,这样做就可以了,等一些矩阵算法

这个嵌套循环很慢,但由于这个操作本质上是索引的变化,我想我可以使用 NumPy 的内置 reshape ( numpy.reshape) 来加速这部分。

不幸的是,我似乎无法找到转换这些索引的好方法。

有什么帮助加快这部分的速度吗?

python arrays performance numpy vectorization

5
推荐指数
1
解决办法
6055
查看次数

如何在这个循环中利用置换对称性?

我有一个f(a,b,c,d)具有以下置换对称性的标量函数

f(a,b,c,d) = f(c,d,a,b) = -f(b,a,d,c) = -f(d,c,b,a)

我正在使用它来完全填充 4D 数组。下面的代码(使用 python/NumPy)有效:

A = np.zeros((N,N,N,N))
for a in range(N):
    for b in range(N):
        for c in range(N):
            for d in range(N):
                A[a,b,c,d] = f(a,b,c,d)
Run Code Online (Sandbox Code Playgroud)

但显然我想利用对称性来减少这部分代码的执行时间。我试过了:

A = np.zeros((N,N,N,N))
ab = 0
for a in range(N):
    for b in range(N):
        ab += 1
        cd  = 0
        for c in range(N):
            for d in range(N):
                cd += 1
                if ab >= cd:
                    A[a,b,c,d] = A[c,d,a,b] = f(a,b,c,d)
Run Code Online (Sandbox Code Playgroud)

这将执行时间减少了一半。但是对于我尝试的最后一次对称:

A = …
Run Code Online (Sandbox Code Playgroud)

python permutation symmetry

5
推荐指数
1
解决办法
99
查看次数