gpt4 book ai didi

python - 有效地 reshape numpy 数组

转载 作者:行者123 更新时间:2023-12-02 08:05:34 25 4
gpt4 key购买 nike

我正在使用 NumPy 数组。

我有一个 2N 长度向量 D,并希望将其一部分 reshape 为 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]

```

一旦编写了C,我就会继续对其进行一些矩阵算术,等等。

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

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

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

最佳答案

您可以使用NumPy broadcasting删除那些嵌套循环 -

C = D[N + np.arange(N)[:,None] - np.arange(N)]

也可以使用np.take替换索引,就像这样 -

C = np.take(D,N + np.arange(N)[:,None] - np.arange(N))

仔细观察会发现该模式接近 toeplitzhankel矩阵。因此,使用这些方法,我们将有另外两种方法来解决它,尽管速度与广播相当。实现看起来像这样 -

from scipy.linalg import toeplitz
from scipy.linalg import hankel

C = toeplitz(D[N:],np.hstack((D[0],D[N-1:0:-1])))
C = hankel(D[1:N+1],D[N:])[:,::-1]

运行时测试

In [230]: M = 1000
...: t = np.arange(M)
...: D = np.sin(t) # initial vector is a sin() function
...: N = M / 2
...:

In [231]: def org_app(D,N):
...: C = np.zeros((N,N))
...: for a in xrange(N):
...: for b in xrange(N):
...: C[a,b] = D[N + a - b]
...: return C
...:

In [232]: %timeit org_app(D,N)
...: %timeit D[N + np.arange(N)[:,None] - np.arange(N)]
...: %timeit np.take(D,N + np.arange(N)[:,None] - np.arange(N))
...: %timeit toeplitz(D[N:],np.hstack((D[0],D[N-1:0:-1])))
...: %timeit hankel(D[1:N+1],D[N:])[:,::-1]
...:
10 loops, best of 3: 83 ms per loop
100 loops, best of 3: 2.82 ms per loop
100 loops, best of 3: 2.84 ms per loop
100 loops, best of 3: 2.95 ms per loop
100 loops, best of 3: 2.93 ms per loop

关于python - 有效地 reshape numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37820107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com