2016-03-15 3 views
3

У меня есть два массива numpy, который описывает пространственную кривую, которые пересекаются в одной точке, и я хочу найти ближайшее значение в обоих массивах для этой точки пересечения, у меня есть этот код, который отлично работает, но его замедляет на большое количество очков.python найти точку пересечения двух массивов numpy

from scipy import spatial 
def nearest(arr0, arr1): 
    ptos = [] 
    j = 0 
    for i in arr0: 
     distance, index = spatial.KDTree(arr1).query(i) 
     ptos.append([distance, index, j]) 
     j += 1 
    ptos.sort() 
    return (arr1[ptos[0][1]].tolist(), ptos[0][1], ptos[0][2]) 

результат будет (<point coordinates>,<position in arr1>,<position in arr0>)

+0

[this] (http://scipy-cookbook.readthedocs.org/items/Intersection.html) – cxw

+0

@cxw, как я могу использовать его в своем случае? – efirvida

+0

Сколько измерений занимают массивы? – Alex

ответ

3

Ваш код делает много вещей, которые вам не нужны. Сначала вы перестраиваете KDtree на каждом цикле, и это пустая трата. Также query берет массив точек, поэтому нет необходимости писать собственный цикл. Ptos - это нечетная структура данных, и вам она не нужна (и ее не нужно сортировать). Попробуйте что-то вроде этого.

from scipy import spatial 

def nearest(arr0, arr1): 
    tree = spatial.KDTree(arr1) 
    distance, arr1_index = tree.query(arr0) 
    best_arr0 = distance.argmin() 
    best_arr1 = arr1_index[best_arr0] 
    two_closest_points = (arr0[best_arr0], arr1[best_arr1]) 
    return two_closest_points, best_arr1, best_arr0 

Если это все еще не достаточно быстро, вы должны описать вашу проблему более подробно и выяснить, если другой алгоритм поиска будет работать лучше для вашей проблемы.

+0

Большое вам спасибо, все запущенные процессы сходят с 3 минут до 20 секунд, вы очень долго меня спасли – efirvida

Смежные вопросы