Tôi có hai mảng numpy 2d: x_array chứa thông tin vị trí theo hướng x, y_array chứa các vị trí theo hướng y.
Sau đó tôi có một danh sách dài các điểm x, y.
Đối với mỗi điểm trong danh sách, tôi cần tìm chỉ số mảng của vị trí (được chỉ định trong các mảng) gần điểm đó nhất.
Tôi đã tạo ra một số mã hoạt động một cách ngây thơ, dựa trên câu hỏi này: Tìm giá trị gần nhất trong mảng numpy
I E
import time
import numpy
def find_index_of_nearest_xy(y_array, x_array, y_point, x_point):
distance = (y_array-y_point)**2 + (x_array-x_point)**2
idy,idx = numpy.where(distance==distance.min())
return idy[0],idx[0]
def do_all(y_array, x_array, points):
store = []
for i in xrange(points.shape[1]):
store.append(find_index_of_nearest_xy(y_array,x_array,points[0,i],points[1,i]))
return store
# Create some dummy data
y_array = numpy.random.random(10000).reshape(100,100)
x_array = numpy.random.random(10000).reshape(100,100)
points = numpy.random.random(10000).reshape(2,5000)
# Time how long it takes to run
start = time.time()
results = do_all(y_array, x_array, points)
end = time.time()
print 'Completed in: ',end-start
Tôi đang làm điều này trên một tập dữ liệu lớn và thực sự muốn tăng tốc nó lên một chút. Bất cứ ai có thể tối ưu hóa điều này?
Cảm ơn.
CẬP NHẬT: GIẢI PHÁP theo đề xuất của @silvado và @justin (bên dưới)
# Shoe-horn existing data for entry into KDTree routines
combined_x_y_arrays = numpy.dstack([y_array.ravel(),x_array.ravel()])[0]
points_list = list(points.transpose())
def do_kdtree(combined_x_y_arrays,points):
mytree = scipy.spatial.cKDTree(combined_x_y_arrays)
dist, indexes = mytree.query(points)
return indexes
start = time.time()
results2 = do_kdtree(combined_x_y_arrays,points_list)
end = time.time()
print 'Completed in: ',end-start
Đoạn mã trên đã tăng tốc mã của tôi (tìm kiếm 5000 điểm trong ma trận 100x100) lên 100 lần. Thật thú vị, việc sử dụng scipy.spatial.KDTree (thay vì scipy.spatial.cKDTree ) đã đưa ra thời gian tương đương với giải pháp ngây thơ của tôi, vì vậy, chắc chắn đáng để sử dụng phiên bản cKDTree ...