2017-04-30 8 views
0

次元に沿って行列をnumpy配列に挿入する関数を記述したいと思います。ここで、次元は関数のパラメータとして与えられます。しかし、私は次元が動的であるという事実に苦しんでいます。私が知っているだろうとした場合、このような寸法何かが働くだろう:numpy配列の動的/パラメータ化された次元に挿入

a = np.ones((2,3,4)) 
print a 

[[[1 1 1 1] [1 1 1 1] [1 1 1 1.]

[1 1 1 1] [1 1 1 1] [1 1 1 1]]]

a[:, 0, :] = np.ones((2,4))*2 
print a 

[[[2.2.1]] [1.11.1]]

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

どのように私はディメンションの挿入を行うことができます2x4(または2x3,3x4)行列の動的?すなわち

、arr.shape =(2,3,4)と仮定:挿入しなければならないマトリックスの形状決意の問題がある:PS

f(arr,i=0, dim=2) 
# would perform the following: 
arr[:,:, 0] = np.ones((2,3))*2 

ながら

f(arr, i=1, dim=0) 
# this would perform the following: 
arr[1, :, :] = np.ones((3,4))*2 

を解決される。

+0

希望する出力は何ですか? – Allen

+0

上記の例の0をパラメータ化した位置に置くことができる関数を用意したいと思います。したがって、func(a、dim = 0)は[0、:、:] =何かを実行し、func(a、dim = 2)は[:、:、0] =何かを行います – blckbird

+0

[:、b、:]ここで、bはあなたのパラメータですか? – Allen

答えて

1

私はあなたがこれらの「取得」の「設定」バージョンをしたいと思います。だから我々はそれを構築することができ

In [160]: np.s_[:,:,0] 
Out[160]: (slice(None, None, None), slice(None, None, None), 0) 

In [155]: arr=np.arange((2*3*4)).reshape(2,3,4) 
In [156]: arr[0] 
Out[156]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
In [157]: arr[:,0] 
Out[157]: 
array([[ 0, 1, 2, 3], 
     [12, 13, 14, 15]]) 
In [158]: arr[:,:,0] 
Out[158]: 
array([[ 0, 4, 8], 
     [12, 16, 20]]) 

np.s_は、これらのインデックスタプルの1がどのように見えるかを私たちに示してスクラッチから。たとえば、タプル連結の場合:

In [161]: idx=(slice(None),)*2+(0,) 
In [162]: idx 
Out[162]: (slice(None, None, None), slice(None, None, None), 0) 
In [164]: arr[idx] 
Out[164]: 
array([[ 0, 4, 8], 
     [12, 16, 20]]) 

一般的な関数を実行するには十分ですか?

np.takeは、特定の軸でインデックスを作成できますが、putに相当するとは思われません。 putがありますが、フラットで動作します。