如何优雅检查数组元素是否存在于另一容器?Numpy优化方案问询
更优雅的Numpy结构化数组元素筛选方法
当然有!你完全不用手动循环拼接数组,Numpy提供了专门的矢量化工具来解决这种元素级的成员判断问题,效率和可读性都比循环高得多。
最优方案:使用np.isin()
np.isin()是专门用来做元素级“是否在集合中”判断的函数,正好匹配你的需求。它会逐个检查原数组的元素是否存在于目标列表中,返回一个布尔索引数组,直接用这个数组就能筛选出符合条件的元素:
import numpy as np students = np.array( [('Jim', 2), ('John', 3), ('Lisa', 5), ('Laura', 1)], dtype=[('name', 'O'), ('grade', 'i4')] ) # 一行代码搞定筛选 absent_students = students[np.isin(students['name'], ['John', 'Laura'])]
运行这段代码后,absent_students就会包含('John', 3)和('Laura', 1)这两个元素,完全符合你的需求。
为什么原来的in操作不行?
你之前尝试的students['name'] in ['John', 'Laura']失效,是因为Numpy数组的in操作符是检查整个数组是否是目标列表的成员,而不是逐个元素判断。这和Python原生列表的in逻辑不一样,所以会得到不符合预期的结果。
对比循环append的优势
手动循环np.append的问题在于,每次调用np.append都会创建一个新的数组(因为Numpy数组是不可变长度的),当数据量较大时,这种方式会产生大量内存开销,效率极低。而np.isin是矢量化操作,Numpy会在底层进行优化,运行速度快得多,代码也更简洁易读。
内容的提问来源于stack exchange,提问作者mapf
相关产品推荐
相关产品推荐

