numpy:在两个2d数组的一个公共轴上进行广播乘法

Kri*_*ris 6 python arrays optimization numpy

我正在寻找一种以元素方式分别乘以形状(a,b)和(b,c)的两个2d数组的方法。在“ b”轴上,这是两个数组的共同点。

例如,我要广播(向量化)的示例是:

import numpy as np    

# some dummy data
A = np.empty((2, 3))
B = np.empty((3, 4))

# naive implementation
C = np.vstack(np.kron(A[:, i], B[i, :]) for i in [0, 1, 2])

# this should give (3, 2, 4)
C.shape
Run Code Online (Sandbox Code Playgroud)

有人知道在这里做什么吗?有没有更好的办法?

piR*_*red 2

归功于@hpaulj 的定义AB
使用np.outer以及np.stack

A = np.arange(6).reshape((2, 3))
B = np.arange(12).reshape((3, 4))

np.stack([np.outer(A[:, i], B[i, :]) for i in range(A.shape[1])])

[[[ 0  0  0  0]
  [ 0  3  6  9]]

 [[ 4  5  6  7]
  [16 20 24 28]]

 [[16 18 20 22]
  [40 45 50 55]]]
Run Code Online (Sandbox Code Playgroud)

并得到np.einsum正确的形状

np.einsum('ij, jk->jik', A, B)

[[[ 0  0  0  0]
  [ 0  3  6  9]]

 [[ 4  5  6  7]
  [16 20 24 28]]

 [[16 18 20 22]
  [40 45 50 55]]]
Run Code Online (Sandbox Code Playgroud)

广播和transpose

(A[:, None] * B.T).transpose(2, 0, 1)

[[[ 0  0  0  0]
  [ 0  3  6  9]]

 [[ 4  5  6  7]
  [16 20 24 28]]

 [[16 18 20 22]
  [40 45 50 55]]]
Run Code Online (Sandbox Code Playgroud)

形状是(3, 2, 4)

定时
在此输入图像描述