Как сравнить numpy массивов по сходству - PullRequest
0 голосов
/ 15 марта 2020

Мне даны два numpy массива: один из измерений i x m и другой из измерений j x m. То, что я хочу сделать, это l oop через FirstArray и сравнить каждый из его элементов с каждым из элементов SecondArray. Когда я говорю «сравнить», я имею в виду: я хочу вычислить евклидово расстояние между элементами FirstArray и SecondArray. Затем я хочу сохранить индекс элемента SecondArray, который находится ближе всего к соответствующему элементу FirstArray, и я также хочу сохранить индекс элемента SecondArray, который находится ближе всего к элементу FirstArray.

В коде это будет выглядеть примерно так:

        smallest = None
        idx = 0
        for i in range(0, FirstArrayRows):
            for j in range(0, SecondArrayRows): 
                EuclideanDistance = np.sqrt(np.sum(np.square(FirstArray[i,:] - SecondArray[j,:]))) 
                if smallest is None or EuclideanDistance < smallest:
                    smallest = EuclideanDistance
                    idx_second = idx
                    idx = j
           Closest[i] = idx 
           SecondClosest[i] = idx_second 

И я думаю, что это работает. Тем не менее, есть два случая, когда этот код не может дать правильный индекс для второго ближайшего элемента SecondArray:

  1. , когда элемент SecondArray, ближайший к элементу FirstArray, имеет значение j = 0 .
  2. когда элемент SecondArray, ближайший к элементу FirstArray, находится в точке j = 1.

Поэтому мне интересно: есть ли лучший способ реализовать это? Я знаю, что есть. Может быть, кто-то может помочь мне увидеть это?

1 Ответ

2 голосов
/ 15 марта 2020

Вы можете использовать вещание numpy в своих интересах. Вычислить евклидово расстояние со всеми элементами второго массива за одну операцию. Затем вы можете найти два наименьших расстояния, используя argpartition.

import numpy as np

i, j, m = 3, 4, 5
a = np.random.choice(10,(i,m))
b = np.random.choice(10,(j,m))
print('First array:\n',a)
print('Second array:\n',b)

closest, second_closest = np.zeros(i), np.zeros(i)
for i in range(a.shape[0]):
    dist = np.sqrt(((a[i,:] - b)**2).sum(axis=1))
    closest[i], second_closest[i] = np.argpartition(dist, 2)[:2]

print('Closest:', closest)
print('Second Closest:', second_closest)

Вывод:

First array:
 [[3 9 0 2 2]
 [1 2 9 9 7]
 [4 0 6 6 4]]
Second array:
 [[9 9 2 2 3]
 [9 9 0 2 3]
 [1 1 6 7 7]
 [5 7 0 4 4]]
Closest: [3. 2. 2.]
Second Closest: [1. 3. 3.]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...