2017-04-21 9 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

これを達成するには複数の方法があります。 1つはnp.fullnp.full((2,2,3), a)に使用し、コメントのDivakarによって指摘されています。あるいは、np.tileを使用すると、入力配列を指定した回数だけ繰り返すことで配列を構築できます。あなたの例を構築するには、行うことができます:

import numpy as np 

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

をごnumpyのバージョンが

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

これは迅速に大​​きな配列のためになりますので、コピーするのではなく、ビューを生成broadcast_toあなたが使用することができます> = 1.10である場合。 EDITはこれがあなたのデモで求めている結果に見えます。 Divakarコメントに基づいて

+0

出力配列は要求通りですが、構文があまり明白でなく、覚えやすいと思います.jotasiとDivakarの回答と比較してください。 – EquipDev

+0

合意。ある程度!タイル()は、aの寸法が出力結果(実際にはブロードキャストされている)よりも小さい場合、自動的に軸のプリペンドを行います。そのため、プロセスを制御する方法を示すために再構成線を挿入します。あなたは結果配列の形にブロードキャストすることがより明確であると主張することができます。私がbroadcast_toの美徳について言及しているのは、読み取り専用のビューを作成するので、非常に迅速です。 – paddyg

2

、答えはも使用できます

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]]]) 
関連する問題