最近又在写科学计算的代码了。今天偶然发现一个 Numpy 中的一个小问题,不注意的话还是很容易踩坑的。
通常来说,检查一个类似列表的对象中是否有某个元素,最直接的办法是用 in
。这个方法对列表、字典、元组等都适用,对一维的 ndarray 对象也适用,例如:
a = [1, 2, 3]
print(4 in a)
b = np.array(a)
print(4 in b)
结果是False False
但是,如果这个 ndarray 是二维的数组,结果就非常奇怪了:
a = [[0,0], [0,1]]
print([0,2] in a)
b = np.array(a)
print([0,2] in b)
结果是False True
。
in
关键词检查是否成员,需要对象有 __contains__
方法,Numpy 所实现的方法,虽然有,但理论上只对标量有效,对向量元素也就是多维数据不成立。具体原理可参考前面的链接,这里不再赘述。
解决的办法也在原贴中有,如果不在乎速度,一般用 [0, 2] in b.tolist()
就可以,也就是转回 list 再运算。对于非常大的数组或者非常在意速度,就需要另想办法了。