如何在numpy数组和向量行之间执行包含操作?

时间:2018-07-10 03:56:14

标签: python numpy

现在我有一个numpy数组,

[[1 2]
 [3 4]
 [2 5]]

和向量。

[2,
 5,
 2]

我想在数组和向量行之间执行一次包含操作。换句话说,我想检查第一行[1, 2]是否包含2,第二行[3, 4]是否包含5。预期的输出如下所示:

[True, False, True] 

如何实现此功能?预先非常感谢。

5 个答案:

答案 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)

https://ideone.com/YmWtlv

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)