具有Numpy或TensorFlow的多个二维矩阵的有效轴方向笛卡尔积

具有Numpy或TensorFlow的多个二维矩阵的有效轴方向笛卡尔积,numpy,product,cartesian,Numpy,Product,Cartesian,所以首先,我想我要实现的是某种笛卡尔积,但从元素上来说,只是跨越列 我想做的是,如果你有多个大小为[(N,D1),(N,D2),(N,D3)…(N,Dn)] 因此,结果是横轴=1的组合乘积,这样最终结果将是形状(N,D),其中D=D1*D2*D3*…Dn e、 g 可扩展到笛卡尔乘积([A,B,C,D…],轴=1) e、 g 我有一个有效的解决方案,它基本上创建一个空(N,D)矩阵,然后在所提供的列表中为每个矩阵的嵌套for循环中的每个列广播向量列式乘积。很明显,一旦阵列变大,情况就很糟糕了 n

所以首先,我想我要实现的是某种笛卡尔积,但从元素上来说,只是跨越列

我想做的是,如果你有多个大小为[(N,D1),(N,D2),(N,D3)…(N,Dn)]

因此,结果是横轴=1的组合乘积,这样最终结果将是形状(N,D),其中D=D1*D2*D3*…Dn

e、 g

可扩展到笛卡尔乘积([A,B,C,D…],轴=1)

e、 g

我有一个有效的解决方案,它基本上创建一个空(N,D)矩阵,然后在所提供的列表中为每个矩阵的嵌套for循环中的每个列广播向量列式乘积。很明显,一旦阵列变大,情况就很糟糕了

numpy或tensorflow中是否存在解决方案?可能是一个高效并行的解决方案(tensorflow解决方案会很好,但numpy是可以的,只要向量逻辑清晰,那么就不难创建tf等价物)

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


谢谢

这里有一种方法可以通过累加的方式重复执行此操作,即在扩展用于elmentwise乘法的数组列表中每对数组的维度后,使用
广播
-

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)

如何存储这些多个二维阵列?作为数组列表?或者可能作为一个3D数组?@Divakar目前,多个2D数组存储在内存中,如示例[a,B…]所示的列表中。这是广播点积的前一步的结果。现在,这还可以,而且单独存储它们也不是瓶颈。如果有任何建议优化这个阶段太我洗耳恭听!明亮的这非常有效(比我目前的方法快约10倍,详见OP)
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]])
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)