Numpy, все попарные корреляции трехмерного массива - PullRequest
2 голосов
/ 07 октября 2011

У меня есть массив формы (l, m, n).Я пытаюсь вычислить матрицу расстояний формы (l, m, n), где entry (i, j, k) - это коэффициент между векторами (i, j, :) и (i,:, k).В numpy или scipy я не нашел ничего подходящего.

Я пытался использовать цикл for и выполнять итерации по оси 0, а затем подавать это в scipy.spatial.distance.pdist, но это занимает много времени.время как сам pdist использует вложенный цикл for.По сути, я хотел бы выполнить pdist по оси 0, но в идеале сделать так, чтобы pdist также не использовал циклы ....

Есть мысли?

Ответы [ 2 ]

3 голосов
/ 08 октября 2011

Я бы лично написал для этого небольшую функцию Cython (http://cython.org).). Напишите и протестируйте итерационную версию Python (с циклами for), переместите ее в файл Python .pyx, добавьте объявления типов и следуйте инструкциям Руководство по интеграции NumPy:

http://docs.cython.org/src/tutorial/numpy.html

Может показаться, что это работа, но если вы занимаетесь вычислениями на Python, некоторые базовые навыки работы с Cython стоит развить, поскольку это значительно облегчает написание расширений C.

0 голосов
/ 05 декабря 2015

Есть мысли?

  1. Первая мысль, что вы не можете вычислить такие расстояния, пока m! = N
  2. Вторая мысль заключается в том, что внутренние циклы pdist не должны беспокоить вас, если они написаны на C, поэтому вероятная причина не в реализации, а в количестве необходимых вычислений
  3. Последняя мысль: ваша проблема может быть решена с помощью numpy.einsum и линейной алгебры:

Код (который я считаю оптимальным):

products = numpy.einsum('ijl, ilk -> ijk')
distances = numpy.einsum('ijj -> ij', products)
distances = distances[:, :, None] + distances[:, None, :] - 2 * product 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...