Это может быть векторизовано (numpy)? - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть список векторов объектов, и я хотел бы вычислить расстояние L2 вектора объектов до всех других векторов объектов в качестве показателя уникальности.Здесь min_distances[i] дает норму L2 i-го вектора признаков.

import numpy as np

# Generate data
nrows = 2000
feature_length = 128
feature_vecs = np.random.rand(nrows, feature_length)

# Calculate min L2 norm from each feature vector
# to all other feature vectors
min_distances = np.zeros(nrows)
indices = np.arange(nrows)
for i in indices:
    min_distances[i] = np.min(np.linalg.norm(
        feature_vecs[i != indices] - feature_vecs[i],
        axis=1))

Быть O (n ^ 2) мучительно медленно и хотело бы его оптимизировать.Можно ли избавиться от цикла for / vectorize, чтобы min и linalg.norm вызывались только один раз?

1 Ответ

0 голосов
/ 03 февраля 2019

Подход № 1

Вот один с cdist -

from scipy.spatial.distance import cdist,pdist,squareform

d = squareform(pdist(feature_vecs))
np.fill_diagonal(d,np.nan)
min_distances = np.nanmin(d,axis=0)

Подход № 2

Другой с cKDTree -

from scipy.spatial import cKDTree

min_distances = cKDTree(feature_vecs).query(feature_vecs, k=2)[0][:,1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...