2016-05-13 5 views
1

で2D numpyの配列の列を選択:更新し、次の配列を考えると1次元配列

from numpy import * 
b = ones((5,5)) 
a = arange(4) 

私は最小限のコードでは、次の配列を取得するにはどうすればよいですか?

私はこれを達成するために1行を使用することができますMATLABで
array([[ 1., 0., 0., 0., 1.], 
     [ 1., 1., 1., 1., 1.], 
     [ 1., 2., 2., 2., 1.], 
     [ 1., 3., 3., 3., 1.], 
     [ 1., 1., 1., 1., 1.]]) 

:あなたが書くことができ

b = ones(5,5); 
a = [0,1,2,3]; 
b(1:4,2:4) = repmat(a',[1,3]) 
+0

インデックスを( ':')基本的にはMATLABとnumpyのは同じです。ただし、リストを使用してインデックスを作成すると、違いがあります。 'b [[0,1,2,3]、[1,2,3]]'は異なっています(エラーを生成します)。 – hpaulj

答えて

2

を:基本的に配列aで配列bの部分を更新

b[0:4, 1:4] = a[:, None] 

bが同じになり、どの〜へ:

array([[ 1., 0., 0., 0., 1.], 
     [ 1., 1., 1., 1., 1.], 
     [ 1., 2., 2., 2., 1.], 
     [ 1., 3., 3., 3., 1.], 
     [ 1., 1., 1., 1., 1.]]) 

b[0:4, 1:4]は、bの適切なスライスを選択します(Pythonはゼロベースのインデックスを使用しています)。

ベクトルaの割り当てを完了するには、長さ1の余分な軸をa[:, None]を使用して追加する必要があります。これは、bのスライスにshape(4,3)があり、ブロードキャストを可能にするために軸が正しく整列するようにshape(4,1)を持つことがaに必要なためです。

+0

'[:、None]'はMATLAB 'repmat'よりも簡単です。 – hpaulj

2

我々はMATLABのために行ったように、出力配列を初期化し、aを設定 -

b = np.ones((5,5)) 
a = np.array([0,1,2,3]) 

それでは、私たちは必要のあるMATLABでrepmatによって行われ、明示的な複製を、交換するnumpyのでサポートされている自動放送を使ってみましょうaを第1の軸に沿って1D要素を「押し込む」ことにより、np.newaxisとしてa[:,np.newaxis]として第2の軸としてシングルトンの次元を導入することによって2D配列を作成する。 NumPyの次元の一般的な用語は軸であることに注意してください。 np.newaxisの略語はNoneであるため、a[:,None]を使用し、bに要素を割り当てるために使用する必要があります。このように、最後のステップは、我々はPythonで0-basedインデックスを持って考慮されるだろう

、我々は持っているだろう - スライスを持つ

b[0:4,1:4] = a[:,None] 
関連する問題