假设有矩阵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的值。我该怎么办?感谢。
答案 0 :(得分:2)
可以为就地编辑建议两种方法。
方法#1:布尔 - 索引到X
。将其重塑为与y
中的元素数量相同的元素数量。从中减去y
,从而利用broadcasting
。最后使用相同的掩码索引到X
并指定展平的减去值。
-
X[mask] = (X[mask].reshape(X.shape[0],-1) - y).ravel()
方法#2:调整y
的大小,使其与True
中mask
个元素的数量相同,并简单地减去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]])