假设有一个矩阵 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 为 true 减去 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: X
的 bool 索引。将其重新调整为具有与 y 中的元素数量相同的元素数量。从中减去y
,从而利用广播
。最后使用相同的掩码索引到 X
并分配展平的减值。
-
X[mask] = (X[mask].reshape(X.shape[0],-1) - y).ravel()
方法#2:调整 y
的大小,使其元素数量与 mask
中的 True
元素数量相同> 并简单地从 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]])
关于arrays - 减去指定二维数组numpy中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45465464/