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

Q Y*_*ang 8 python numpy

现在我有一个numpy数组,

[[1 2]
 [3 4]
 [2 5]]
Run Code Online (Sandbox Code Playgroud)

和一个矢量.

[2,
 5,
 2]
Run Code Online (Sandbox Code Playgroud)

我想在数组和向量行之间执行包含操作.换句话说,我想检查第一行是否[1, 2]包含2,第二行是否[3, 4]包含5.预期的输出看起来像:

[True, False, True] 
Run Code Online (Sandbox Code Playgroud)

我怎么能实现这个功能?提前谢谢了.

Mad*_*ist 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)
Run Code Online (Sandbox Code Playgroud)

https://ideone.com/YmWtlv

reshape将您的1D(行)向量转换为列向量.这是必要的,因为通常广播沿着右边的方向排列,所以你需要一个明确的尾随维度1.另一种完成同样事情的方法是使用newaxis(又名None):

v = np.array([2, 5, 2])[..., np.newaxis]
Run Code Online (Sandbox Code Playgroud)

注意

我的原始答案建议reduce使用logical_or,这只是一种更复杂的说法any:

np.logical_or.reduce(a == v, axis=1)
Run Code Online (Sandbox Code Playgroud)


Hal*_*Ali 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]
Run Code Online (Sandbox Code Playgroud)

使用np.any axis=1:

np.any(arr == a[:, None], axis=1)
# outputs: array([ True, False,  True])
Run Code Online (Sandbox Code Playgroud)

  • 任何解决方案都是最好的解决方案.不知道第一部分的重点是什么. (2认同)

Ale*_*ing 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)
Run Code Online (Sandbox Code Playgroud)

输出:

[ True, False,  True]
Run Code Online (Sandbox Code Playgroud)

这会将所有元素与向量进行比较vector,然后减少行数.