2016-12-12 4 views
0

Если у меня есть два массива:Для каждой точки в массиве, найти ближайшую точку к нему во втором массиве и вывод, что индекс

X = np.random.rand(10000,2) 
Y = np.random.rand(10000,2) 

Как я могу, для каждой точки X, выяснить, какие точка в Y ближе всего к ней? Так что в конце концов у меня есть массив, показывающий:

x1_index y_index_of_closest 
    1    7 
    2    54 
    3    3 
    ...    ... 

Я хочу сделать это для обоих столбцов в X и сравнить друг с каждого столбца и значения в Y

+0

Вы уже что-то пробовали? – iFlo

+0

Сортировка второго массива и использование * бинарного поиска * затем. –

+0

@FlorianJOUFFREAU Я сделал вложенную для типа типа цикла, но это был абсолютный беспорядок. – ishido

ответ

1

Вы можете сделать это с помощью двух 1D массивов таким образом:

>>> X = np.random.rand(5) 
>>> Y = np.random.rand(5) 
[ 0.28563805 0.8024654 0.37208334 0.19939014 0.05764439] 
[ 0.51599936 0.79707534 0.18558314 0.75968517 0.4606329 ] 

>>> for i, val in enumerate(X): 
    ... print (np.abs(Y - val)).argmin() 
2 
1 
4 
2 
2 

Если вы хотите сделать это с помощью 2D массива, вы должны будете предоставить более подробную информацию.

2

Это должно быть наиболее часто задаваемый NumPy вопрос (я ответил сам это дважды на прошлой неделе), но так как он может быть сформулирован миллион способов:

import numpy as np 
import scipy.spatial.distance.cdist as cdist 

def withScipy(X,Y): # faster 
    return np.argmin(cdist(X,Y,'sqeuclidean'),axis=0) 

def withoutScipy(X,Y): #slower, using broadcasting 
    return np.argmin(np.sum((X[None,:,:]-Y[:,None,:])**2,axis=-1), axis=0) 

Там также NumPy только метод с использованием einsum, это быстрее, чем моя функция (но не cdist), но я не понимаю этого достаточно, чтобы объяснить это.

+0

да снова ... здесь описан einsum-подход, а более подробные версии будут пузырьками вверх, используя einsum и numpy в поиске по ключевым словам – NaN