使用 Numpy 或 TensorFlow 的多个二维矩阵的高效轴向笛卡尔积

Efficient axis-wise cartesian product of multiple 2D matrices with Numpy or TensorFlow

所以首先,我认为我想要实现的是某种笛卡尔积,但在元素方面,仅跨列。

我想做的是,如果您有多个大小为 [ (N,D1), (N,D2), (N,D3)...(N,Dn) ][ 的二维数组=13=]

因此,结果是跨轴=1 的组合乘积,因此最终结果的形状为 (N, D),其中 D=D1*D2*D3*...Dn

例如

A = np.array([[1,2],
              [3,4]])
B = np.array([[10,20,30],
              [5,6,7]])

cartesian_product( [A,B], axis=1 )
>> np.array([[ 1*10, 1*20, 1*30, 2*10, 2*20, 2*30 ]
             [ 3*5,  3*6,  3*7,  4*5,  4*6,  4*7  ]])

并可扩展到 cartesian_product([A,B,C,D...], axis=1)

例如

A = np.array([[1,2],
              [3,4]])
B = np.array([[10,20],
              [5,6]])
C = np.array([[50, 0],
              [60, 8]])
cartesian_product( [A,B,C], axis=1 )
>> np.array([[ 1*10*50, 1*10*0, 1*20*50, 1*20*0, 2*10*50, 2*10*0, 2*20*50, 2*20*0] 
             [ 3*5*60,  3*5*8,  3*6*60,  3*6*8,  4*5*60,  4*5*8,  4*6*60,  4*6*8]])

我有一个有效的解决方案,它基本上创建一个空的 (N,D) 矩阵,然后在提供的列表中的每个矩阵的嵌套 for 循环中为每一列广播一个向量列乘积。一旦阵列变大,显然是可怕的!

numpy 或 tensorflow 中是否有现成的解决方案?可能是一个可有效并行化的解决方案(tensorflow 解决方案会很棒,但 numpy 也可以,只要矢量逻辑清晰,那么制作 tf 等效项应该不难)

我不确定是否需要使用 einsum、tensordot、meshgrid 或它们的某种组合来实现此目的。我有一个解决方案,但仅适用于来自 的单维向量,即使该解决方案说适用于任意维度数组(这似乎意味着向量)。有了那个我可以做一个.prod(axis=1),但这同样只对向量有效。

谢谢!

这是一种以累积方式迭代执行此操作的方法,在从数组列表中扩展每对的维数后使用 broadcasting 进行逐项乘法 -

L = [A,B,C]  # list of arrays
n = L[0].shape[0]
out = (L[1][:,None]*L[0][:,:,None]).reshape(n,-1)
for i in L[2:]:
    out = (i[:,None]*out[:,:,None]).reshape(n,-1)