isclose
使用广播应该可以工作,并且使用浮点数更准确:
In [112]: x = np.arange(9.).reshape(3,3); y = np.array([1.,5.])
In [113]: np.isclose(x[:,:,None],y)
Out[113]:
array([[[False, False],
[ True, False],
[False, False]],
[[False, False],
[False, False],
[False, True]],
[[False, False],
[False, False],
[False, False]]])
In [114]: _.any(axis=-1)
Out[114]:
array([[False, True, False],
[False, False, True],
[False, False, False]])
相比:
In [115]: np.isin(x,y)
Out[115]:
array([[False, True, False],
[False, False, True],
[False, False, False]])
编辑
一个正确的例子isclose
- 由于它如何处理浮动
In [117]: x = np.arange(.1,1,.1).reshape(3,3); y = np.array([.3,.7])
In [118]: x
Out[118]:
array([[0.1, 0.2, 0.3],
[0.4, 0.5, 0.6],
[0.7, 0.8, 0.9]])
In [119]: x.tolist()
Out[119]:
[[0.1, 0.2, 0.30000000000000004],
[0.4, 0.5, 0.6],
[0.7000000000000001, 0.8, 0.9]]
相比:
In [121]: np.isin(x,y)
Out[121]:
array([[False, False, False],
[False, False, False],
[False, False, False]])
In [122]: np.isclose(x[:,:,None],y).any(axis=-1)
Out[122]:
array([[False, False, True],
[False, False, False],
[ True, False, False]])
isin
使用==
测试,并且可能由于浮点精度而失败。