Как умножить каждую строку массива на все строки массива поэлементно в Python - PullRequest
0 голосов
/ 07 сентября 2018

Мне нужно умножить каждую строку массива A на все строки массива B поэлементно.Например, предположим, у нас есть следующие массивы:

A = np.array([[1,5],[3,6]])
B = np.array([[4,2],[8,2]])

Я хочу получить следующий массив C :

C = np.array([[4,10],[8,10],[12,12],[24,12]])

Я мог бы сделать это, используя для цикла, но я думаю, что мог бы быть лучший способ сделать это.

РЕДАКТИРОВАТЬ: Я думал о повторении и разбиении на листы, но мои массивы не настолько малы.Это может создать проблемы с памятью.

1 Ответ

0 голосов
/ 07 сентября 2018

Кредитное плечо broadcasting, расширяющее затемнения для A до 3D с None/np.newaxis, выполнить поэлементное умножение и преобразовать обратно в 2D -

(A[:,None]*B).reshape(-1,B.shape[1])

что по существу будет -

(A[:,None,:]*B[None,:,:]).reshape(-1,B.shape[1])

Схематически говоря, это:

A     :  M x 1 x N
B     :  1 x K x N
out   :  M x K x N

Окончательное изменение формы для объединения двух последних осей и получения массива (M x K*N) в форме 2D.


Мы также можем использовать einsum для выполнения расширения до 3D и поэлементного умножения в одном вызове функции -

np.einsum('ij,kj->ikj',A,B).reshape(-1,B.shape[1])
...