使用 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)
所以首先,我认为我想要实现的是某种笛卡尔积,但在元素方面,仅跨列。
我想做的是,如果您有多个大小为 [ (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)