[SciPy-User] More efficient way of sorting and filtering structured array.
Dharhas Pothina
Dharhas.Pothina@twdb.state.tx...
Wed Aug 4 11:52:12 CDT 2010
Hi,
I have a structured array that contains intersection points between two sets of lines (specified by LINENAME and FILENAME). For each unique combination of LINENAME and FILENAME, there are a number of matches in the array intersection_points and I need only the closest match (i.e. the pdist field in the array is the smallest). The following snippet works but is extremely slow. I was wondering if there is a more efficient way to do this.
# Creates closest_points array with zeros
closest_points = np.zeros(0,dtype=pnt_dtype)
# loops through unique linenames of intersection_points
for linename in np.unique(intersection_points['LINENAME']):
# loops through unique filenames of intersection_points
for filename in np.unique(intersection_points['FILENAME']):
# create seperate temporary arrays from intersection_points matching linename THEN filename
idx_line = intersection_points['LINENAME'] == linename
idx_file = intersection_points['FILENAME'] == filename
# create temporary array from only points of correct linename AND filename
tmp_points = intersection_points[idx_line * idx_file]
# Eliminates empty array errors by making sure something is present
if tmp_points.size > 0:
# sort tmp_points array by pdist
idx_sort = np.argsort(tmp_points, order='pdist')
# add closest tmp_point to bottom of closest_points file
closest_points = np.hstack((closest_points,tmp_points[idx_sort][0]))
for reference pnt_dtype is :
pnt_dtype = np.dtype([('lon','f8'),('lat','f8'),('x','f8'),('y','f8'),
('FILENAME','S50'),
('FILE_NUM','i4'),
('SSID','i8'),
('Lidx', 'i4'),
('pdist', 'f8'),
('LINENAME','S50'),
('HE_Code','i4'),
('PairNum','i4'),
('dist', 'S50')
])
thanks,
- dharhas
More information about the SciPy-User
mailing list