2016-08-25 11 views
1

私は、配列内のデータとの置換時の問題を抱えている: はNumpy ---配列内の特定の複数要素を同時に置換する方法は?

a = [1, 0, 0] 
b = [0, 0, 0] 
c = [0, 0] 
X = numpy.zeros((3, 3, 2)) 

、と言うと私は形状のマトリックスY(2,3,2)を持っており、それが今、零行列

非です。私はYのこれらの要素を直接Yと等しくしたい。

X[tuple(numpy.where(a==0)[0]), 
    tuple(numpy.where(b==0)[0]), 
    tuple(numpy.where(c==0)[0])] = Y 

は、私はあなたがインデックスXのために適切なインデックスアレイを構築するためにnp.ix_を使用することができ、エラーshape mismatch: objects cannot be broadcast to a single shape

+0

形状のブール配列(3,3,2)によってインデックス付けされます 'Y'形状(3,3,2)の代わりに(2,3,2)を持っていますか? – unutbu

+0

なし、Y = [[[0 48] [27 27] [44 44] [0 0] [44 44] [0 43。 ]]] –

+0

Yのサイズは(2,3,2)です。そして、私はそれをXで置き換えたいが、ある場所では –

答えて

1

ました:

import numpy as np 
np.random.seed(2016) 
a=np.array([1, 0, 0]) 
b=np.array([0, 0, 0]) 
c=np.array([0, 0]) 
X = np.zeros((3,3,2)) 
Y = np.random.randint(1, 10, size=(2,3,2)) 

idx = np.ix_(a==0, b==0, c==0) 
X[idx] = Y 
print(X) 

利回りを

array([[[ 0., 0.], 
     [ 0., 0.], 
     [ 0., 0.]], 

     [[ 9., 8.], 
     [ 3., 7.], 
     [ 4., 5.]], 

     [[ 2., 2.], 
     [ 3., 3.], 
     [ 9., 9.]]]) 

または、1Dブール配列(a=0)(a==0)[:,None,None]adds new axesにおける通り

mask = (a==0)[:,None,None] & (b==0)[None,:,None] & (c==0)[None,None,:] 
X[mask] = Y 

インデックス(a=0)ブールマスクを構築することができました。 (a==0)[:,None,None]は、形状(3,1,1)を有する。同様に、(b==0)[None,:,None]は、形状(1,3,1)を有し、(c==0)[None,None,:]は、形状(1,1,2)を有する。

&(bitwise-and)と組み合わせると、3つの配列は、1つの共通の形状(3,3,2)にbroadcastedになります。このように、X

X[mask] = Y 
+0

ありがとう、しかし、Yが(2,3,2)サイズを持っている場合には何らかの方法がありますか?私が言っていることは、もしYがXのサイズが違うなら、Xにそれを格納するために何ができるのでしょうか? –

+0

何度も何度もありがとう、うまくいく......私はX [mask] = Y ....と言っています –

関連する問題