如何仅使用numpy操作基于两个其他numpy数组的条件获取一个新的numpy数组?

3
假设我有一个np.array,其中a = [0, 1, 1, 0, 0, 1]b = [1, 1, 0, 0, 0, 1]
我想要一个新的矩阵c,如果a[i]=0b[i]=0,则c[i]=True
我尝试使用c=np.where(a==0 & b==0),但似乎这不适用于两个数组。
最终,我想要在两种情况下都为真的'0'的计数和在两种情况下都为真的'1'的计数,而且不使用任何循环和外部库。请给予建议。
1个回答

0
这是我的解决方案:
你的逻辑表达式实际上是 c = NOT (a OR b)。这意味着,只有当 a[i]b[i] 都为零时,你才希望 c[i] = True。OR 运算可以通过将两个数组相加来实现。然后我们将数组转换为布尔类型并取反。
import numpy as np

a = np.array([0, 1, 1, 0, 0, 1])
b = np.array([1, 1, 0, 0, 0, 1])

c = np.invert((a+b).astype('bool'))

如果你想要计算零的数量,你可以简单地执行以下操作。
n_zeros = np.sum(c)

更通用的解决方案:

如果你想让数组 c[i] = True 当且仅当 a[i] == a0 and b[i] == b0,你可以这样做:

c = (a == a0) & (b == b0)

条件 a == a0b == b0 分别返回一个布尔数组,其中包含每个单独数组元素的条件真值。按位运算符 & 执行逐元素逻辑 AND 运算。有关更多按位运算符,请参见 https://wiki.python.org/moin/BitwiseOperators

这是一个有趣的答案。但是如果我想要 if a[i] = 0 and b[i] = 1 那么 c[i] = True 怎么办?能够使用条件语句会很好。 - user13998944
我添加了一个更通用的解决方案,希望对你有用。你不能在numpy数组上使用逻辑运算符,你需要使用位运算符,请参见https://dev59.com/CmEi5IYBdhLWcg3wRayf。因此,在这种情况下,你可以使用&代替乘法。 - Mar H.
是的,就是这个!这是点积吧?但为什么它会这样工作呢?谢谢。 - user13998944
不,* 是方括号中两个数组的逐元素乘积,这两个数组又都是布尔数组。如果你将两个布尔值相乘,当且仅当它们都为 True 时结果才为 True,否则为 False。因此,这等价于逻辑 AND 运算。 - Mar H.
我编辑了我的答案,使用位运算符代替算术运算符,现在应该更清晰了。 - Mar H.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接