मेरे पास दो 2 डी अंक वाली सरणियाँ हैं: x_array में x- दिशा में स्थितीय जानकारी है, y_array में y- दिशा में स्थितियाँ हैं।
मेरे पास तब x, y बिंदुओं की एक लंबी सूची है।
सूची में प्रत्येक बिंदु के लिए, मुझे उस स्थान के सरणी सूचकांक (सरणियों में निर्दिष्ट) को खोजने की आवश्यकता है जो उस बिंदु के सबसे करीब है।
मैंने इस प्रश्न के आधार पर कुछ कोड तैयार किए हैं, जो काम करता है: निकटतम मान का पता लगाएं
अर्थात
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
मैं इसे बड़े डेटासेट पर कर रहा हूं और वास्तव में इसे थोड़ा गति देना चाहता हूं। क्या कोई इसका अनुकूलन कर सकता है?
धन्यवाद।
अद्यतन: @silvado और @justin (नीचे) द्वारा सुझावों का समाधान
# 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
ऊपर दिए गए इस कोड ने मेरे कोड को (100x100 मैट्रिसेस में 5000 अंकों की खोज) 100 गुना बढ़ा दिया। दिलचस्प बात यह है का उपयोग कर scipy.spatial.KDTree (के बजाय scipy.spatial.cKDTree ) मेरी भोली समाधान करने के लिए तुलनीय समय दिया था, तो यह cKDTree संस्करण का उपयोग कर निश्चित रूप से लायक है ...