Эффективное суммирование внешнего продукта для 1D массивов NumPy

#python #numpy #optimization

#python #numpy #оптимизация

Вопрос:

У меня есть функция вида

введите описание изображения здесь

Один из способов реализовать эту функцию в numpy — собрать матрицу для суммирования по:

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

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

Ответ №1:

Вы могли бы использовать 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
  

Комментарии:

1. @reptilicus Это идеальный способ описать это! 🙂

2. бах, мой комментарий был удален. Увы, у цензоров есть мой номер

3. @reptilicus Ха-ха, наверное, работает какой-то детский ИИ-бот 😉