python - Numpy 搜索子集中数组的元素

标签 python numpy

假设我有 numpy 数组

a = np.array([1,3,5,7,9,11,13])
b = np.array([3,5,7,11,13])

我想创建一个大小为 a 的 bool 数组,其中每个条目是 True 或 False,具体取决于 a 的元素是否也在 b 中。

所以在这种情况下,我想要

a_b = np.array([False,True,True,True,False,True,True]). 

当 b 由一个元素组成时,我可以执行此操作,即 a == b[0]。当 b 的长度大于 1 时,有没有快速的方法来做到这一点。

最佳答案

使用numpy.in1d :

In [672]: np.in1d([1,2,3,4], [1,2])
Out[672]: array([ True,  True, False, False], dtype=bool)

对于您的数据:

In [674]: np.in1d(a, b)
Out[674]: array([False,  True,  True,  True, False,  True,  True], dtype=bool)

根据文档,此功能在 1.4.0 或更高版本中可用。该文档还描述了该操作在纯 Python 中的外观:

in1d can be considered as an element-wise function version of the python keyword in, for 1-D sequences. in1d(a, b) is roughly equivalent to np.array([item in b for item in a]).

该函数的文档值得一读,因为有 invert 关键字参数和 assume_unique 关键字参数 - 每个参数在某些情况下都非常有用.

我还发现使用 np.vectorizeoperator.contains 创建自己的版本很有趣:

from operator import contains
v_in = np.vectorize(lambda x,y: contains(y, x), excluded={1,})

然后:

In [696]: v_in([1,2,3, 2], [1, 2])
Out[696]: array([ True,  True, False,  True], dtype=bool)

因为 operator.contains 翻转了参数,所以我需要 lambda 来使调用约定与您的用例相匹配 - 但如果可以的话,您可以跳过此步骤首先调用 b,然后调用 a

但请注意,您需要对 vectorize 使用 excluded 选项,因为您希望哪个参数代表 b 序列(要检查的序列)的成员资格)实际上保留为序列(因此,如果您选择不使用 lambda 翻转 contains 参数,那么您需要排除索引 0 不是 1)。

使用 in1d 的方式肯定会更快,并且是更好的方式,因为它依赖于众所周知的内置函数。但有时了解如何使用 operatorvectorize 来实现这些技巧是很有好处的。

您甚至可以创建一个 Python Infix recipe instance为此,然后使用 v_in 作为“中缀”操作:

v_in = Infix(np.vectorize(lambda x,y: contains(y, x), excluded={1,}))
# even easier: v_in = Infix(np.in1d)

和示例用法:

In [702]: v_in([1, 2, 3, 2], [1, 2])
Out[702]: array([ True,  True, False,  True], dtype=bool)

In [704]: [1, 2, 3, 2] <<v_in>> [1, 2]
Out[704]: array([ True,  True, False,  True], dtype=bool)

关于python - Numpy 搜索子集中数组的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27217325/

相关文章:

c++ - Array of array 和过滤性能

python - 将 H2O 模型导入 Python

python - 使用 Python 安装 Gaphor 时 PYPATH 无注册表项错误

python - 通过 Python Flask 服务器提供服务时,Vue 应用程序不会加载

python - 如何使用 2 个 pandas DataFrame 计算 IOU(重叠)

python numpy.savetxt header 有额外的字符#

Python Numpy 结构化数组(recarray)赋值到切片

python - 根据行值保留数据框列

python - 在 ubuntu 14.04 上安装 graph-tool 时配置错误

python - 需要返回协方差的 Python 多项式拟合函数