Сравните все элементы в двух массивах numpy без использования цикла - PullRequest
0 голосов
/ 08 мая 2018

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

Вот очень простой пример того, как я делаю это прямо сейчас на python:

import scipy as sp
test_array = sp.array([(1,1,1),(3,4,5),(6,12,18)])
sumx = test_array.sum(axis=1)
centroid_vector = sumx / len(test[0])
for i in centroid_vector:
    x = abs(test_array - i)
    minimum = sp.argmin(x)

Желаемый результат - это матрица с минимальным расстоянием, исходным значением (из test_array) и индексом элемента в векторе центроида, до которого расстояние является наименьшим. В этом случае это будет выглядеть примерно так:

[(0, 1, 1), 
 (0, 1, 1), 
 (0, 1, 1),
 (1, 3, 2), 
 (0, 4, 2),
 ...
 (6, 18, 3)]

1 Ответ

0 голосов
/ 09 мая 2018

Вот одно из решений вашего вопроса:

import scipy as sp
test_array = sp.array([(1,1,1),(3,4,5),(6,12,18)])
# Create the centroid another way but yours is fine
centroid_vector = test_array.sum(axis=1)/test_array.shape[1]
# Generate an array with all the difference between 
# each element of test_array (row) and centroid_vector (column)
delta_array = abs(test_array.reshape((9,1)) - centroid_vector)
# Finally, the first column of your output is delta_array.min(axis=1), 
# the second is test_array.reshape((9,1))
# and the third is delta_array.argmin(axis=1)
# so you can do:
array_output = sp.array([delta_array.min(axis=1),test_array.reshape((9)),
                         delta_array.argmin(axis=1)]).transpose()

Примечание: индекс элемента в centroid_vector начинается с 0 (соглашение по Python), а не с 1, как в вашем вопросе, а просто введите delta_array.argmin(axis=1) +1, если вы хотите 1, 2 или 3 в третьем столбце.

Примечание 2: избегайте использования sum в качестве имени переменной, это встроенная функция, которая может вызвать некоторые проблемы в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...