#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 Ха-ха, наверное, работает какой-то детский ИИ-бот 😉