minus指定2D数组numpy中的元素

时间:2017-08-02 15:48:44

标签: arrays numpy

假设有矩阵X,掩码和向量y

>>> X
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> mask
array([[False,  True,  True,  True],
       [ True, False,  True,  True],
       [ True,  True, False,  True],
       [ True,  True,  True, False]], dtype=bool)
>>> y
[8, 9, 10]

我想要X的每一行,其中mask是真减去y。所以我得到了结果

>>> x[mask].reshape(4,3)-y
array([[-7, -7, -7],
       [-4, -3, -3],
       [ 0,  0,  1],
       [ 4,  4,  4]])

但我希望将X保持为4 * 4矩阵。这意味着掩码为False时,不应更改X的值。我该怎么办?感谢。

1 个答案:

答案 0 :(得分:2)

可以为就地编辑建议两种方法。

方法#1:布尔 - 索引到X。将其重塑为与y中的元素数量相同的元素数量。从中减去y,从而利用broadcasting。最后使用相同的掩码索引到X并指定展平的减去值。   -

X[mask] = (X[mask].reshape(X.shape[0],-1) - y).ravel()

方法#2:调整y的大小,使其与Truemask个元素的数量相同,并简单地减去X -

X[mask] -= np.resize(y,mask.sum())

样品运行 -

In [55]: X    # Input array
Out[55]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

# Using approach #1
In [56]: X[mask] = (X[mask].reshape(X.shape[0],-1) - y).ravel()

In [57]: X  # Changed input array
Out[57]: 
array([[ 0, -7, -7, -7],
       [-4,  5, -3, -3],
       [ 0,  0, 10,  1],
       [ 4,  4,  4, 15]])

In [59]: X   # Input array
Out[59]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

# Using approach #2
In [60]: X[mask] -= np.resize(y,mask.sum())

In [61]: X    # Changed input array
Out[61]: 
array([[ 0, -7, -7, -7],
       [-4,  5, -3, -3],
       [ 0,  0, 10,  1],
       [ 4,  4,  4, 15]])