You could use np.ix_
to construct index arrays appropriate for indexing X
:
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)
yields
array([[[ 0., 0.],
[ 0., 0.],
[ 0., 0.]],
[[ 9., 8.],
[ 3., 7.],
[ 4., 5.]],
[[ 2., 2.],
[ 3., 3.],
[ 9., 9.]]])
Alternatively, you could construct a boolean mask
mask = (a==0)[:,None,None] & (b==0)[None,:,None] & (c==0)[None,None,:]
X[mask] = Y
Indexing (a=0)
as in (a==0)[:,None,None]
adds new axes to the 1D boolean array (a=0)
. (a==0)[:,None,None]
has shape (3,1,1). Similarly, (b==0)[None,:,None]
has shape (1,3,1), and (c==0)[None,None,:]
has shape (1,1,2).
When combined with &
(bitwise-and), the three arrays are broadcasted to one common shape, (3,3,2). Thus, X
gets indexed by one boolean array of shape (3,3,2) in
X[mask] = Y