3
3
import traceback
4
4
5
5
import numpy as np
6
- from scipy import sparse , spatial
6
+ from scipy import sparse
7
+ import scipy .spatial as sps
7
8
8
9
from pygsp import utils
9
10
from pygsp .graphs import Graph # prevent circular import in Python < 3.5
@@ -38,17 +39,17 @@ def _import_pfl():
38
39
39
40
40
41
def _knn_sp_kdtree (X , num_neighbors , dist_type , order = 0 ):
41
- kdt = spatial .KDTree (X )
42
+ kdt = sps .KDTree (X )
42
43
D , NN = kdt .query (X , k = (num_neighbors + 1 ),
43
44
p = _dist_translation ['scipy-kdtree' ][dist_type ])
44
45
return NN , D
45
46
46
47
def _knn_flann (X , num_neighbors , dist_type , order ):
47
- pfl = _import_pfl ()
48
48
# the combination FLANN + max_dist produces incorrect results
49
49
# do not allow it
50
50
if dist_type == 'max_dist' :
51
51
raise ValueError ('FLANN and max_dist is not supported' )
52
+ pfl = _import_pfl ()
52
53
pfl .set_distance_type (dist_type , order = order )
53
54
flann = pfl .FLANN ()
54
55
@@ -60,26 +61,26 @@ def _knn_flann(X, num_neighbors, dist_type, order):
60
61
return NN , D
61
62
62
63
def _radius_sp_kdtree (X , epsilon , dist_type , order = 0 ):
63
- kdt = spatial .KDTree (X )
64
+ kdt = sps .KDTree (X )
64
65
D , NN = kdt .query (X , k = None , distance_upper_bound = epsilon ,
65
66
p = _dist_translation ['scipy-kdtree' ][dist_type ])
66
67
return NN , D
67
68
68
69
def _knn_sp_pdist (X , num_neighbors , dist_type , order ):
69
- pd = spatial .distance .squareform (
70
- spatial .distance .pdist (X ,
71
- _dist_translation ['scipy-pdist' ][dist_type ],
72
- p = order ))
70
+ pd = sps .distance .squareform (
71
+ sps .distance .pdist (X ,
72
+ metric = _dist_translation ['scipy-pdist' ][dist_type ],
73
+ p = order ))
73
74
pds = np .sort (pd )[:, 0 :num_neighbors + 1 ]
74
75
pdi = pd .argsort ()[:, 0 :num_neighbors + 1 ]
75
76
return pdi , pds
76
77
77
78
def _radius_sp_pdist (X , epsilon , dist_type , order ):
78
79
N , dim = np .shape (X )
79
- pd = spatial .distance .squareform (
80
- spatial .distance .pdist (X ,
81
- _dist_translation ['scipy-pdist' ][dist_type ],
82
- p = order ))
80
+ pd = sps .distance .squareform (
81
+ sps .distance .pdist (X ,
82
+ metric = _dist_translation ['scipy-pdist' ][dist_type ],
83
+ p = order ))
83
84
pdf = pd < epsilon
84
85
D = []
85
86
NN = []
@@ -92,16 +93,25 @@ def _radius_sp_pdist(X, epsilon, dist_type, order):
92
93
return NN , D
93
94
94
95
def _radius_flann (X , epsilon , dist_type , order = 0 ):
95
- pfl = _import_pfl ( )
96
+ N , dim = np . shape ( X )
96
97
# the combination FLANN + max_dist produces incorrect results
97
98
# do not allow it
98
99
if dist_type == 'max_dist' :
99
100
raise ValueError ('FLANN and max_dist is not supported' )
101
+
102
+ pfl = _import_pfl ()
100
103
pfl .set_distance_type (dist_type , order = order )
101
104
flann = pfl .FLANN ()
102
105
flann .build_index (X )
103
106
107
+ D = []
108
+ NN = []
109
+ for k in range (N ):
110
+ nn , d = flann .nn_radius (X [k , :], epsilon )
111
+ D .append (d )
112
+ NN .append (nn )
104
113
flann .delete_index ()
114
+ return NN , D
105
115
106
116
class NNGraph (Graph ):
107
117
r"""Nearest-neighbor graph from given point cloud.
0 commit comments