Как я векторизовал эти две операции без использования цикла? - PullRequest
1 голос
/ 23 октября 2019

есть операция в numpy, которую мне трудно реализовать без зацикливания

Эта операция состоит в том, что у меня есть два входа: beta,x

beta.shape = (M,N,K) и x.shape = (I,K)

Интересующая меня операция может быть выполнена с помощью цикла for следующим образом:

result = np.zeros((M,N,I,K)) # buffer to save my operation results
for m in range(M):
    for n in range(N):
         beta_ = beta[m][n] # has shape (K,)
         result[m][n] = x * beta_

Давайте расскажем об уловках, которые я могу сделать без циклов, чтобы вся операция могла быть вычислительно эффективной?

1 Ответ

0 голосов
/ 23 октября 2019

Вы заинтересованы в умножении элементов по общему измерению K и сохранении результатов по оставшимся измерениям.

Это означает, что вы можете использовать np.einsum, используя измерения бета, x иформа, которая вас интересует, например: 'mnk,ik->mnik':

import numpy as np

M = 4
N = 3
I = 7
K = 6

beta = np.arange(M*N*K).reshape(M,N,K)
x = np.arange(I*K).reshape(I,K)

result1 = np.zeros((M,N,I,K)) # buffer to save my operation results
for m in range(M):
    for n in range(N):
         beta_ = beta[m][n] # has shape (K,)
         result1[m][n] = x * beta_


result2 = np.einsum('mnk,ik->mnik', beta, x)

print (np.array_equal(result1,result2))
True

Не часть вопроса, а разговор о np.einsum ... Если вы хотите подвести итогдля любого из этих измерений вы можете опустить его из конечных размеров:

import numpy as np

M = 4
N = 3
I = 7
K = 6

beta = np.arange(M*N*K).reshape(M,N,K)
x = np.arange(I*K).reshape(I,K)

result1 = np.zeros((M,N,I,K)) # buffer to save my operation results
for m in range(M):
    for n in range(N):
         beta_ = beta[m][n] # has shape (K,)
         result1[m][n] = x * beta_
result1 = result1.sum(axis=1)


result2 = np.einsum('mnk,ik->mik', beta, x)

print (np.array_equal(result1,result2))
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...