Open QuLogic opened 6 years ago
I'm not sure if this is a bug or not, but the 'invalid' value is different depending on the query:
>>> import numpy as np >>> a = np.arange(30.0) >>> kdt = KDTree(a) >>> kdt.query(np.arange(5) + 0.5) (array([0.5, 0.5, 0.5, 0.5, 0.5]), array([0, 1, 2, 3, 4], dtype=uint32)) >>> kdt.query(np.arange(50) + 0.5) (array([ 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5]), array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29], dtype=uint32))
everything okay above.
So if we set distance_upper_bound, then invalid points are np.inf and len(data_pts):
distance_upper_bound
np.inf
len(data_pts)
>>> kdt.query(np.arange(50) + 0.5, distance_upper_bound=10) (array([0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf]), array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], dtype=uint32))
But if we pass np.nan, the invalid point is DBL_MAX and UINT_MAX:
np.nan
DBL_MAX
UINT_MAX
>>> kdt.query(np.array([np.nan])) (array([1.34078079e+154]), array([4294967295], dtype=uint32))
For reference, SciPy's cKDTree returns (inf, len(data_pts)) for np.nan.
(inf, len(data_pts))
The intention is to be drop-in compatible with SciPy's CKDTree so this is a bug
I'm not sure if this is a bug or not, but the 'invalid' value is different depending on the query:
everything okay above.
So if we set
distance_upper_bound
, then invalid points arenp.inf
andlen(data_pts)
:But if we pass
np.nan
, the invalid point isDBL_MAX
andUINT_MAX
: