我有两个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
由于
答案 0 :(得分:2)
您可以使用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尝试将broadcast两个数组转换为单个兼容的形状,然后再测试相等性。在这种情况下,[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)
答案 1 :(得分:1)
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)以查看其工作原理。