2017-05-09 6 views
-1

によって4Dimensionalのnp.arrayを宣言します。は、私が設定することができますどのように2Dimensional np.array

d[i, j, i] = s[i, j] - s[i] 

dsがnumpyのを使用して2次元np.array で、forループせずに、4次元np.arrayのですか?

私がフォロー試してみた:

d = np.zeros([10, 10, 10, 10]) 
s = np.ones([10, 10]) 
l1 = range(M) 
l2 = range(N) 
d[np.ix_(l1, l2, l1)] = s[np.ix_(l1, l2)] - s[np.ix_(l1)] 

をしかし、私が望むようには動作しません。

d[i, j, k] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 

が、私はより良い寸法を区別するために、iとJA異なる範囲を与える

d[i, j, k] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

if i != k 
+0

あなたがD、S、希望の出力とのより良い例を与えることができたのか? (すべて0または1ではない) – Allen

+0

's'を指定すると、結果はすべて0になります。 – hpaulj

+0

それはあまり明確ではありません.. –

答えて

0

たい:

反復解法:

In [271]: d = np.zeros((3,4,3,4),int) 
In [272]: s = np.arange(12).reshape(3,4) 
In [273]: for i in range(3): 
    ...:  for j in range(4): 
    ...:   d[i,j,i,:] = s[i,j]-s[i,:] 

配列ソリューション:

In [274]: d1 = np.zeros((3,4,3,4),int) 
In [281]: l1=np.arange(3) 
In [283]: d1[l1,:,l1,:] = (s[:,:,None]-s[:,None,:]) 

チェック

In [284]: np.allclose(d,d1) 
Out[284]: True 

In [285]: d[0,1,0,:] 
Out[285]: array([ 1, 0, -1, -2]) 
In [286]: d[0,1,2,:] 
Out[286]: array([0, 0, 0, 0]) 
In [287]: d1[0,1,0,:] 
Out[287]: array([ 1, 0, -1, -2]) 
In [288]: d1[0,1,1,:] 
Out[288]: array([0, 0, 0, 0]) 
In [289]: d1[1,2,2,:] 
Out[289]: array([0, 0, 0, 0]) 
In [290]: d1[2,2,2,:] 
Out[290]: array([ 2, 1, 0, -1]) 

s = np.ones((3,4))場合は、dは、すべての値に対して0です。

In [302]: d1[l1,:,l1,:].shape 
Out[302]: (3, 4, 4) 
In [303]: (s[:,:,None]-s[:,None,:]).shape 
Out[303]: (3, 4, 4) 

このインデックスの変種:

In [318]: I,J=np.ix_(l1,l2) 
In [319]: I 
Out[319]: 
array([[0], 
     [1], 
     [2]]) 
In [320]: J 
Out[320]: array([[0, 1, 2, 3]]) 
In [321]: d1[I,J,I,:].shape 
Out[321]: (3, 4, 4) 

あなたの前の質問を解決するには、

In [323]: d1[I,J,I,J] = s 
関連する問題