numpy 数组的条件运算

新手上路,请多包涵

我是 NumPy 的新手,在 numpy 数组上运行一些条件语句时遇到了问题。假设我有 3 个像这样的 numpy 数组:

A:

 [[0, 4, 4, 2],
 [1, 3, 0, 2],
 [3, 2, 4, 4]]

乙:

 [[6, 9, 8, 6],
 [7, 7, 9, 6],
 [8, 6, 5, 7]]

并且,c:

 [[0, 0, 0, 0],
 [0, 0, 0, 0],
 [0, 0, 0, 0]]

我有一个 a 和 b 的条件语句,其中我想使用 b 的值(如果满足 a 和 b 的条件)来计算 c 的值:

 c[(a > 3) & (b > 8)]+=b*2

我收到一条错误消息:

 Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
ValueError: non-broadcastable output operand with shape (1,) doesn't match the broadcast shape (3,4)

知道我该怎么做吗?

我希望 c 的输出如下所示:

 [[0, 18, 0, 0],
 [0, 0, 0, 0],
 [0, 0, 0, 0]]

原文由 bobby12345 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 773
2 个回答

您可以使用 numpy.where

 np.where((a > 3) & (b > 8), c + b*2, c)
#array([[ 0, 18,  0,  0],
#       [ 0,  0,  0,  0],
#       [ 0,  0,  0,  0]])

或者在算术上:

 c + b*2 * ((a > 3) & (b > 8))
#array([[ 0, 18,  0,  0],
#       [ 0,  0,  0,  0],
#       [ 0,  0,  0,  0]])

原文由 Psidom 发布,翻译遵循 CC BY-SA 3.0 许可协议

问题是 您屏蔽了接收部分,但 没有屏蔽发送方部分。因此:

 c[(a > 3) & (b > 8)]+=b*2
# ^ 1x1 matrix        ^3x4 matrix

尺寸不一样。如果您想执行 逐元素添加(根据您的示例),您也可以简单地将切片添加到正确的部分:

 c[(a > 3) & (b > 8)]+=b[(a > 3) & (b > 8)]*2

或者提高效率:

 mask = (a > 3) & (b > 8)
c[mask] += b[mask]*2

原文由 Willem Van Onsem 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题