繁体   English   中英

将ndarray与1D数组中的值进行比较以获得掩码

[英]comparing ndarray with values in 1D array to get a mask

我有两个numpy数组,分别是2D和1D。 我想获得一个2D二进制掩码,如果它与1D数组的任何元素匹配,则掩码的每个元素都为真。

 2D array 
 -----------
 1 2 3 
 4 9 6
 7 2 3


 1D array 
 -----------
 1,9,3

 Expected output
 ---------------
 True   False  True
 False  True   False
 False  False  True

谢谢

你可以使用np.in1d 虽然np.in1d返回一维数组,但您可以简单地重新np.in1d结果:

In [174]: arr = np.array([[1,2,3],[4,9,6],[7,2,3]])

In [175]: bag = [1,9,3]

In [177]: np.in1d(arr, bag).reshape(arr.shape)
Out[177]: 
array([[ True, False,  True],
       [False,  True, False],
       [False, False,  True]], dtype=bool)

请注意, in1d是检查arr中的元素是否匹配bag中的任何元素。 与此相反, arr == bag测试,如果的元素arr等于的广播元件bag 逐元素 您可以通过置换bag来看到差异:

In [179]: arr == np.array([1,3,9])
Out[179]: 
array([[ True, False, False],
       [False, False, False],
       [False, False, False]], dtype=bool)

In [180]: np.in1d(arr, [1,3,9]).reshape(arr.shape)
Out[180]: 
array([[ True, False,  True],
       [False,  True, False],
       [False, False,  True]], dtype=bool)

当您比较两个不等形状的数组时,NumPy会尝试在测试相等性之前将两个数组广播为单个兼容的形状。 在这种情况下, [1, 3, 9]被广播

array([[1, 3, 9],
       [1, 3, 9],
       [1, 3, 9]])

因为新的轴添加在左侧。 您可以通过这种方式检查广播效果:

In [181]: np.broadcast_arrays(arr, [1,3,9])
Out[185]: 
[array([[1, 2, 3],
        [4, 9, 6],
        [7, 2, 3]]), 
 array([[1, 3, 9],
        [1, 3, 9],
        [1, 3, 9]])]

一旦两个数组被广播到一个共同的形状,就会以元素方式测试相等性,这意味着对相应位置的值进行相等性测试。 例如,在顶行中,等式测试是1 == 1 2 == 3 3 == 9 因此,

In [179]: arr == np.array([1,3,9])
Out[179]: 
array([[ True, False, False],
       [False, False, False],
       [False, False, False]], dtype=bool)
a = np.array([[1,2,3],[4,9,6],[7,2,3]])
b = np.array([1,9,3])

你试过这个:

print a == b
## array([[ True, False,  True],
##        [False,  True, False],
##        [False, False,  True]], dtype=bool)

查看广播( http://docs.scipy.org/doc/numpy-1.10.1/user/basics.broadcasting.html )以查看其工作原理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM