2017-04-21 134 views
3

如何創建形狀爲[2, 2, 3]的numpy數組,其中軸2的元素是另一個數組,例如[1, 2, 3]如何用另一個數組創建或填充一個numpy數組?

所以我想這樣做無效代碼:

a = np.arange(1, 4) 
b = np.full((3, 3), a) 

像數組得到的:

[[[ 1. 2. 3.] 
    [ 1. 2. 3.]] 
[[ 1. 2. 3.] 
    [ 1. 2. 3.]]] 

當然可以使填充像迴路,但認爲有可能是一個快捷方式:

for y in range(b.shape[0]): 
    for x in range(b.shape[1]): 
     b[y, x, :] = a 
+3

只需使用預期形狀與'np.full':'np.full((2,2,3),a)'? – Divakar

+0

「軸2上的元素是另一個陣列」。那應該是一個「(2,3)」形陣列吧?你所建議的'[1,2,3]'不是... –

+0

@TomdeGeus:不,這個例子中的意圖是把一個數組變成'[2,2,3]',或者我稱之爲[ 2,2]數組,其中元素是一個'[3]'數組。 – EquipDev

回答

3

有多種方法可以實現這一點。 Divakar在評論中指出,其中一種是使用np.full((2,2,3), a)中的np.full。或者,您可以使用np.tile來實現此目的,這允許您通過重複給定次數的輸入數組來構造一個數組。構建您例如,你可以這樣做:

import numpy as np 

np.tile(np.arange(1, 4), [2, 2, 1]) 
2

如果numpy的版本爲> = 1.10,您可以使用broadcast_to

a = np.arange(1,4) 
a.shape = (1,1,3) 
b = np.broadcast_to(a,(2,2,3)) 

這將產生一個視圖,而不是複製這樣會更快的大型陣列。 編輯這看起來是你的演示要求的結果。

+0

輸出數組是按照要求的,但我認爲語法不太明顯,並且易於記憶,與來自jotasi和Divakar的答案相比較。 – EquipDev

+0

同意。在某種程度上!如果a的維數小於輸出結果(broadcast_to實際上也是這樣),則tile()會自動預置軸,因此我將整形線放入以顯示如何控制該過程。你可以爭辯說,廣播到結果數組的形狀更清晰。正如我所說的,broadcast_to的優點在於它使得只讀視圖非常快速。 – paddyg

2

基於Divakar評論,答案也可以是:

import numpy as np 
np.full([2, 2, 3], np.arange(1, 4)) 

另一種可能性是:

import numpy as np 
b = np.empty([2, 2, 3]) 
b[:] = np.arange(1, 4) 
1

而且使用np.concatenate或它的包裝np.vstack

In [26]: a = np.arange(1,4) 

In [27]: np.vstack([a[np.newaxis, :]]*4).reshape(2,2, 3) 
Out[27]: 
array([[[1, 2, 3], 
     [1, 2, 3]], 

     [[1, 2, 3], 
     [1, 2, 3]]]) 

In [28]: np.concatenate([a[np.newaxis, :]]*4, axis=0).reshape(2,2, 3) 
Out[28]: 
array([[[1, 2, 3], 
     [1, 2, 3]], 

     [[1, 2, 3], 
     [1, 2, 3]]]) 
相關問題