现在我有一个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)
我怎么能实现这个功能?提前谢谢了.
您可以将向量广播到列中,将其等同于矩阵行中的所有元素,并查看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)
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)
使用列表理解和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)
这个单行应该这样做.它也适用于任意数量的列.
# 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,然后减少行数.
| 归档时间: |
|
| 查看次数: |
330 次 |
| 最近记录: |