未知维数张量的元素乘法

时间:2015-11-19 10:47:17

标签: python arrays numpy numpy-broadcasting

如何使用以下形状对张量进行元素乘法运算?这里的第二个数组总是假定为2D。

[x, y, ?, ?, ?, ...] * [x, y]

我想在所有标注的尺寸上进行广播,其中我不知道先验数字。我考虑过的可能的解决方案(但不知道该怎么做):

  • 向第二个数组添加可变数量的轴
  • 反转两个阵列的轴的顺序,然后再将它们反转

任何指针都会很棒。

3 个答案:

答案 0 :(得分:4)

问题中提到的替代方案(使用b 2D数组):

  • 将可变数量的轴添加到第二个数组

    a * b.reshape(b.shape + (1,)*(a.ndim-b.ndim))
    
  • 反转两个阵列的轴的顺序,然后再将它们反转

    (a.T * b.T).T
    

einsum的另一种选择:

numpy.einsum('ij...,ij->ij...', a, b)

答案 1 :(得分:2)

不漂亮,但确实有效:

a = np.zeros((3, 4, 5, 6))
b = np.zeros((3, 4))
c = a*b[(slice(None), slice(None), )+(None, )*(a.ndim-2)]

答案 2 :(得分:1)

假设输入数组为ABB2D数组。首先,将A重新整形为3D数组,并将尾部不匹配的维度合并为一个维度,然后使用B执行广播的元素乘法,最后将产品重新整形为原始数据A的形状。实现看起来像这样 -

shp = A.shape  # Get shape of A
out = (A.reshape(shp[0],shp[1],-1)*B[:,:,None]).reshape(shp)

验证输出 -

In [96]: A = np.random.rand(2,3,4,5,7,8,4)

In [97]: B = np.random.rand(2,3)

In [98]: shp = A.shape
    ...: out = (A.reshape(shp[0],shp[1],-1)*B[:,:,None]).reshape(shp)
    ...: 

In [99]: direct_out = A*B[:,:,None,None,None,None,None]

In [100]: np.allclose(out,direct_out) # Verify
Out[100]: True