Numpy ---如何同时替换数组中的某些多元素?

时间:2016-08-25 09:46:52

标签: python arrays numpy

在替换数组中的数据时遇到问题: 说,

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

1 个答案:

答案 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

中的一个布尔形状数组(3,3,2)索引
X[mask] = Y