Python中如何检查数组是否包含某值_利用NumPy的in1d函数匹配元素
应优先用 x in arr 检查单值存在性;np.in1d 适用于批量判断,需注意 assume_unique 参数、类型一致性和浮点精度问题;新代码推荐 np.isin 替代。
用 np.in1d 判断数组是否含某值,但别直接用它做“存在性检查”
np.in1d 的设计目标是批量判断多个元素是否在另一个数组中出现,返回布尔数组,不是 True/False。想查“某个值 x 是否在 arr 里”,直接写 np.in1d([x], arr) 会返回 [True] 或 [False],还得额外取索引或调 any() —— 多此一举。
- 真正轻量的写法是:
x in arr(对一维ndarray有效,底层走 C 级成员检查) - 如果
arr是高维,先用arr.flatten()或arr.ravel()拉平再查 -
np.in1d合适的场景是:你有一组待查值test_vals,想一次性知道它们各自是否在ref_arr中出现
np.in1d 的 assume_unique 参数影响性能,不设对默认值可能拖慢 3 倍以上
当 ref_arr(第二个参数)本身不含重复值时,显式传 assume_unique=True,np.in1d 会跳过去重步骤,改用哈希查找;否则默认会先调 np.unique 去重,尤其对大数组代价明显。
- 确认
ref_arr无重复?直接加assume_unique=True - 不确定?别硬设
True,否则结果可能错(比如ref_arr = [1, 1, 2],设True后in1d([1], ref_arr)可能返回[False]) - 实测:100 万元素数组,设
False(默认)比True慢 2.7×,且内存多占约 40%
注意 np.in1d 对数据类型敏感,浮点比较容易误判
如果 test_vals 和 ref_arr 类型不一致(比如一个是 float32,一个是 float64),或含浮点数,np.in1d 用的是严格相等(==),不是近似相等。小误差会导致本该匹配的值被漏掉。
FILM
利用两张现有的图像,创建一个动画。
下载
- 避免混用精度:统一转成
ref_arr.astype(test_vals.dtype)再传入 - 真要处理浮点容差?别用
np.in1d,改用np.isclose配合广播,例如:np.any(np.isclose(ref_arr, x, atol=1e-8)) - 整数、字符串、bool 安全;
datetime64和object类型也能用,但速度慢,且object数组中若含NaN会引发TypeError
替代方案:什么时候该换 np.isin?
np.isin 是 np.in1d 的现代替代,语义更清晰、行为更直观(比如保持输入维度、支持 invert 参数),且从 NumPy 1.13 起就推荐使用。老代码里看到 in1d,基本都可以无缝换成 isin。
- 函数签名几乎一样:
np.isin(test_vals, ref_arr, assume_unique=...) - 返回形状和
test_vals一致,不用再 reshape;而in1d总是返回一维 - 如果你用的是 NumPy ≥ 1.13,新代码直接写
np.isin,别纠结兼容旧版本 - 唯一要注意:
np.isin不支持kind参数(in1d有但极少用),一般不影响
实际用的时候,最常被忽略的是类型对齐和浮点精度——不是函数不会用,而是没意识到输入数据本身就在悄悄破坏匹配逻辑。