我想知道数组a在哪里等于数组b中的任何一个值。
例如,
a = np.random.randint(0,16, size=(3,4))
b = np.array([2,3,9])
# like this, but for any size b:
locations = np.nonzero((a==b[0]) | (a==b[1]) | (a==b[3]))
原因是我可以将a中的值从(b中的任何一个)更改为另一个值:
a[locations] = 99
对相等性检查进行或运算并不是一个很好的解决方案,因为我想在不事先知道b的大小的情况下进行运算,有数组解决方案吗?
[编辑]现在这个问题有两个很好的答案,一个使用额外维度的广播,另一个使用np.in1d
。这两个都适用于这个问题的特定情况。我最终使用np.isin
代替,因为它似乎对a
和b
的形状更不可知。
我接受了教给我关于in1d
的答案,因为它引导我找到了我更喜欢的解决方案。
3条答案
按热度按时间sulc1iza1#
您可以使用
np.in1d
,然后使用reshape
返回到a
的形状,这样您就可以将a
中的值设置为您的特殊标志。jvlzgdj92#
对等式检查进行或运算并不是一个很好的解决方案,因为我想在不提前知道b的大小的情况下做这个。
编辑:
矢量化后的代码等同于你上面写的代码-
这表明您的输出与这个输出完全相同,而不需要显式地提到
b[0], b[1]...
或使用for循环。解释-
1.在这种情况下,广播一个操作可以帮助您。您尝试做的是将每个
(3,4)
矩阵元素与b
中的每个值(3,)
进行比较。这意味着所需的结果布尔矩阵将是三个(3,4)矩阵,即(3,3,4)
1.一旦你完成了,你需要在三个(3,4)矩阵元素之间取一个
ANY
或OR
,这将把(3,3,4)
减少到(3,4)
1.最后,您需要使用
np.nonzero
来标识值等于TRUE
的位置以上3个步骤可按以下方法进行-
gkn4icbw3#
numpy.isin
适用于多维的a
和b
。