2016-04-20 5 views
5

Я пытаюсь вычислить sinc(vec*dist) над всеми попарных расстояний для каждого vec, где vec является 1D массив и dist является попарные расстояния векторов строк в матрице coord. Я использую:Быстрее способ получить умножение матриц

dist = scipy.spatial.distance.pdist(coord) 

for i in range(len(vec)): 
    I_avr[i] = numpy.sum(numpy.sinc(vec[i]*dist)) 
    print vec[i], I_avr[i] 

Обычно coord имеет 10^5 до 10^6 векторов и длина vec составляет 10^3 до 10^4. Может ли кто-нибудь рекомендовать улучшения или изменения, чтобы сделать это быстрее?

+1

Если вы можете предоставить некоторые данные примера, возможно, мы сможем помочь. Возможно, может помочь ['numpy.einsum'] (http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.einsum.html). –

+0

Это кажется неосуществимым на одной машине. 'dist' является массивом' O (n^2) ', где' n' составляет не менее 10^5. Вероятно, он занимает не менее 5 ГБ памяти, без каких-либо ошибок. Вы подтвердили, что код даже выходит за рамки этой первой строки? –

+0

@AlexHall: Спасибо за ваш комментарий. У меня есть ошибки памяти, вычисляющие pdist. Получение парных расстояний один за другим решает проблему памяти, но кажется неэффективным. –

ответ

0

Теоретически вы можете разделить матрицу расстояния на куски и сделать это блочным блоком, а затем заполнить, однако я не думаю, что это вообще возможно, потому что sum(sinc(...)) занимает слишком много времени. Давайте попробуем его с одним блоком размером 10 000:

>>> from scipy.spatial import distance 
>>> import numpy as np 
>>> np.random.seed(0) 
>>> coord = np.random.random((10000, 3)) 
>>> dist = distance.pdist(coord) 
>>> %timeit np.sum(np.sinc(dist)) 
1 loop, best of 3: 1.82 s per loop 

Это просто для одного элемента, и умножения нет. Если vec имеет размер 10^3 до 10^4, время для одного 10k x 10k кусок будет от 30 минут до 5,5 часов.

Теперь, если мы увеличиваем размер coord до значения от 10^5 до 10^6, общее истекшее время будет, как ожидается, будет где-то от 55 часов до 6,3 лет, в зависимости от конкретных значений входов.

Смежные вопросы