在替换数组中的数据时遇到问题: 说,
a = [1, 0, 0]
b = [0, 0, 0]
c = [0, 0]
X = numpy.zeros((3, 3, 2))
我的矩阵Y
有形状(2,3,2),它不是零矩阵
现在;我想直接将这些X的元素等于Y;
X[tuple(numpy.where(a==0)[0]),
tuple(numpy.where(b==0)[0]),
tuple(numpy.where(c==0)[0])] = Y
我收到错误shape mismatch: objects cannot be broadcast to a single shape
答案 0 :(得分:1)
您可以使用np.ix_
构建适合索引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)
产量
array([[[ 0., 0.],
[ 0., 0.],
[ 0., 0.]],
[[ 9., 8.],
[ 3., 7.],
[ 4., 5.]],
[[ 2., 2.],
[ 3., 3.],
[ 9., 9.]]])
或者,您可以构造一个布尔掩码
mask = (a==0)[:,None,None] & (b==0)[None,:,None] & (c==0)[None,None,:]
X[mask] = Y
将(a=0)
adds new axes中的(a==0)[:,None,None]
索引到1D布尔数组(a=0)
。 (a==0)[:,None,None]
有形状(3,1,1)。同样地,(b==0)[None,:,None]
具有形状(1,3,1),(c==0)[None,None,:]
具有形状(1,1,2)。
当与&
(按位和)组合时,三个数组为broadcasted到一个共同形状,(3,3,2)。因此,X
被
X[mask] = Y