2016-10-19 2 views
1

у меня есть функция видаэффективно суммируя внешний продукт для 1D NumPy массивы

enter image description here

Одним из способов реализации этой функции в NumPy, чтобы собрать матрицу просуммировать:

y = a*b - np.sum(np.outer(a*b, b), axis=0) 

Есть ли лучший способ реализовать эту функцию с numpy, которая не предполагает создание массива NxN?

ответ

2

Вы можете использовать np.einsum -

y = a*b - np.einsum('i,i,j->j',a,b,b) 

Мы также можем выполнить a*b и кормить einsum -

y = a*b - np.einsum('i,j->j',a*b,b) 

На втором подходе мы можем сэкономить время выполнения, сохраняя a*b и повторное использование. Тест

Продолжительность -

In [253]: a = np.random.rand(4000) 

In [254]: b = np.random.rand(4000) 

In [255]: %timeit np.sum(np.outer(a*b, b), axis=0) 
10 loops, best of 3: 105 ms per loop 

In [256]: %timeit np.einsum('i,i,j->j',a,b,b) 
10 loops, best of 3: 24.2 ms per loop 

In [257]: %timeit np.einsum('i,j->j',a*b,b) 
10 loops, best of 3: 21.9 ms per loop 
+0

@reptilicus Это идеальный способ, чтобы описать его! :) – Divakar

+0

bah, мой комментарий удален. Увы, у цензоров есть мой номер – reptilicus

+0

@reptilicus Ха-ха, какой-то малый AI-бот на работе, вероятно;) – Divakar

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