簡體   English   中英

有效地重塑numpy數組

[英]Efficiently reshape numpy array

我正在使用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]

```

一旦做出C ,我就繼續做一些矩陣運算,等等。

這個嵌套循環非常慢,但由於這個操作基本上是索引的變化,我認為我可以使用NumPy的內置重塑( 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM