2011-12-29 50 views
1

我有一個循環,增加了元件以一維數組:加入numpy的矢量到numpy的多維數組

for i in range(0, 1000): 
     fvector[0, i] = function_value 

循環結束後,我有要存儲在一個1×1000矢量一個多維數組fmatrix,它的大小是50 x 1000.我設法使用一個循環並單獨複製每個元素 - 但它非常緩慢。然後,我嘗試使用切片在循環之後一次複製整個矢量,然後準備在下一列複製下一個矢量。我如何讓它進入下一列?我試過了:

s=slice([i], None) 
    fmatrix[s] = fvector 

和s的各種組合,但我得到有關設置序列或無效語法的數組元素的錯誤消息。

我知道這應該是簡單的,但我很新的蟒蛇,numpy的和數組:-(

回答

1

分配試試這個。分配矩陣,在這裏零初始化的效果:

>>> import numpy as np 
>>> fmatrix = np.zeros((50, 1000)) 

然後索引它來獲取fvector

>>> fvector = fmatrix[0] 

然後分配給fvector的元素:

>>> for i in xrange(1000): 
...  fvector[i] = i 

如果您現在檢查fmatrix[0],第一行fmatrix,您會發現它已被分配到前一個循環中。這是因爲NumPy行索引在fmatrix的第一行創建fvector作爲視圖。這爲您節省了一份副本。

+0

這是一個非常整潔的把戲! – wot 2011-12-29 14:59:15

+0

如何進入fmatrix [1],然後一直移動到最後一行而沒有出現'索引越界錯誤? – wot 2011-12-29 15:22:49

+0

@wot:你可以用'fvector在fmatrix'中循環遍歷行;不需要索引。 – 2011-12-29 15:52:02

1

fvector具有形狀(1,1000),這是一個二維數組,即使一個軸的長度爲1. 可以切它下降到一維數組與fvector[0,:]。這使第一行。

fmatrix已形狀(50,1000),用戶可以切它下降到一維數組與fmatrix[i,:]。這給出了i th row。

因此,要分配fi中的值的fvector第一個行的fmatrixi個行:

fmatrix[i,:] = fvector[0,:] 

但是也許沒有必要fvector是一個二維數組?也許只是讓一維數組開始:

fvector = np.empty(1000) 
for i in range(0, 1000): 
    fvector[i] = function_value 

,然後你可以做

fmatrix[i,:] = fvector 
+0

謝謝 - 我意識到我對1d-2d陣列的困惑可能導致其他地方出現問題。 – wot 2011-12-29 12:46:59

+0

我回去了,將2D數組更改爲1D,這對分配語法非常有幫助。我使用larsmans'view'功能來填充矩陣。非常感謝兩位。 – wot 2011-12-30 11:37:04