现在我有一个numpy数组,
[[1 2]
[3 4]
[2 5]]
和向量。
[2,
5,
2]
我想在数组和向量行之间执行一次包含操作。换句话说,我想检查第一行[1, 2]
是否包含2
,第二行[3, 4]
是否包含5
。预期的输出如下所示:
[True, False, True]
如何实现此功能?预先非常感谢。
答案 0 :(得分:7)
您可以将向量广播到一列中,将其等同于矩阵行中的所有元素,然后查看每一行中any
元素是否为True
:
import numpy as np
a = np.array(
[[1, 2],
[3, 4],
[2, 5]])
v = np.array([2, 5, 2]).reshape(-1, 1)
np.any(a == v, axis=1)
reshape
将您的1D(行)矢量转换为列矢量。这是必要的,因为通常broadcasting沿着右边排列形状,因此您需要显式的尾随尺寸1。另一种完成相同操作的方法是使用newaxis
(也称为None
):
v = np.array([2, 5, 2])[..., np.newaxis]
注意
我最初的答案建议使用reduce
logical_or
,这只是any
的一种更复杂的表达方式:
np.logical_or.reduce(a == v, axis=1)
答案 1 :(得分:6)
使用列表理解和zip
arr = np.array([[1, 2],[3, 4],[2, 5]])
a = np.array([2,5,2])
[y in x for x, y in zip(arr, a)]
# outputs: [True, False, True]
将np.any与axis=1
一起使用:
np.any(arr == a[:, None], axis=1)
# outputs: array([ True, False, True])
答案 2 :(得分:6)
这种单线应该做到这一点。它也适用于任意数量的列。
# Set up
import numpy as np
array = np.array([[1, 2],[3, 4],[2, 5]])
vector = np.array([2,5,2])
# Solution
result = np.logical_or.reduce(array == vector[:,None], 1)
输出:
[ True, False, True]
这会将所有元素与列向量vector
进行比较,然后减少行数。
答案 3 :(得分:3)
我们还可以利用广播和点积。
a = np.array([[1, 2], [3, 4], [2, 5]])
b = np.array([2, 5, 2])
解决方案
(a == b[:,None]) @ np.array([1, 1]).astype(bool)
答案 4 :(得分:1)
您可以将2D数组的第一列和第二列与向量进行比较,并对获得的结果执行logical or
操作。
import numpy as np
a = np.array([[1, 2],[3, 4],[2, 5]])
b = [2,5,2]
np.logical_or(a[:,0] == b , a[:,1] == b)
输出:
array([ True, False, True], dtype=bool)