Есть ли конкретное использование функции scdy для pdist для некоторых конкретных индексов?

Мой вопрос об использовании pdist-функции scipy.spatial.distance. Хотя мне приходится вычислять расстояния Хэмминга между вектором 1x64 и каждым из других миллионов векторов 1x64, которые хранятся в 2D-массиве, я не могу сделать это с помощью pdist. Потому что он возвращает расстояния Хэмминга между любыми двумя векторами внутри одного и того же 2D-массива. Интересно, есть ли способ заставить его вычислять расстояния Хэмминга между вектором определенного индекса и каждым другим.

Вот мой текущий код, сейчас я использую 1000x64, потому что ошибка памяти появляется с большими массивами.

import numpy as np
from scipy.spatial.distance import pdist


ph = np.load('little.npy')

print pdist(ph, 'hamming').shape

и вывод

(499500,)

little.npy имеет массив 1000x64. Например, если я хочу видеть только расстояния Хэмминга с 31. вектором и все остальные. Что я должен делать?

1 ответ

Решение

Ты можешь использовать cdist, Например,

In [101]: from scipy.spatial.distance import cdist

In [102]: x
Out[102]: 
array([[0, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 1, 0],
       [0, 0, 0, 1, 1, 1, 0, 0],
       [1, 0, 1, 1, 0, 1, 1, 0],
       [1, 0, 1, 1, 0, 1, 1, 1],
       [0, 1, 0, 1, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 1, 0, 0],
       [1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 0, 0, 1, 1, 1, 0],
       [1, 0, 0, 1, 1, 0, 0, 1]])

In [103]: index = 3

In [104]: cdist(x[index:index+1], x, 'hamming')
Out[104]: 
array([[ 0.625,  0.375,  0.5  ,  0.   ,  0.125,  0.75 ,  0.375,  0.375,
         0.5  ,  0.625]])

Это дает расстояние Хэмминга между строкой в ​​индексе 3 и всеми другими строками (включая строку в индексе 3). В результате получается двумерный массив с одной строкой. Вы можете сразу же извлечь эту строку, чтобы получить результат 1D:

In [105]: cdist(x[index:index+1], x, 'hamming')[0]
Out[105]: 
array([ 0.625,  0.375,  0.5  ,  0.   ,  0.125,  0.75 ,  0.375,  0.375,
        0.5  ,  0.625])

я использовал x[index:index+1] вместо просто x[index] так что вход является двумерным массивом (с одной строкой):

In [106]: x[index:index+1]
Out[106]: array([[1, 0, 1, 1, 0, 1, 1, 0]])

Вы получите ошибку, если вы используете x[index],

Другие вопросы по тегам