【问题标题】:Python 3D-1D Array multiplicationPython 3D-1D 数组乘法
【发布时间】:2021-01-22 07:54:56
【问题描述】:

好的,所以我想将一个 3D 数组和 1D 数组相乘,然后像下面的示例一样进行求和

A = [Array([[[100, 100, 100],
            [100, 100, 100]],

            [[100, 100, 100],
            [100, 100, 100]]]), 

    Array([[[200, 200, 200],
            [200, 200, 200]],

            [[200, 200, 200],
            [200, 200, 200]]])]

Weight = [0.25,0.75]


# A[0]*Weight[0]+A[1]*Weight[1]

C = [[[100*0.25 + 200*0.75, 100*0.25 + 200*0.75, 100*0.25 + 200*0.75],
      [100*0.25 + 200*0.75, 100*0.25 + 200*0.75, 100*0.25 + 200*0.75]],
    
     [[100*0.25 + 200*0.75, 100*0.25 + 200*0.75, 100*0.25 + 200*0.75],
      [100*0.25 + 200*0.75, 100*0.25 + 200*0.75, 100*0.25 + 200*0.75]]]
    
  = [[[175, 175, 175],
      [175, 175, 175]],
    
     [[175, 175, 175],
      [175, 175, 175]]]

问题是我如何在 python 中做到这一点?我尝试使用np.multiplynp.dotnp.matmul,但它们似乎都没有按我的预期工作。也许我没有正确地做到这一点。顺便说一句,我还希望它能够乘以更大的数组,例如 A 数组,其中包含多个 Array(),而不仅仅是示例中的 2。当然Weight Array 的长度会跟随A Array 的长度。另外,如果可能的话,我也想避免使用for-loop,而只使用numpy 函数。

【问题讨论】:

标签: python arrays numpy multidimensional-array


【解决方案1】:

只需广播这些值并总结它们。

import numpy as np

A = np.array([np.array([[[100, 100, 100],
            [100, 100, 100]],

            [[100, 100, 100],
            [100, 100, 100]]]), 

    np.array([[[200, 200, 200],
            [200, 200, 200]],

            [[200, 200, 200],
            [200, 200, 200]]])])


Weight = np.array([0.25,0.75])

P = (A * Weight[:, None, None, None]).sum(0)

或者您也可以使用einsum。将最后一行替换为 -

P = np.einsum("ijkl,i->jkl", A, Weight)

给出相同的结果。

【讨论】:

  • 当我使用 P = (A * Weight[:, None, None, None]).sum(0) 时出现此错误 TypeError: list indices must be integers or slices, not tuple ,但如果我使用 einsum 它可以工作
【解决方案2】:

试试:

A = np.array([np.array([[[100, 100, 100],
            [100, 100, 100]],

            [[100, 100, 100],
            [100, 100, 100]]]), 

    np.array([[[200, 200, 200],
            [200, 200, 200]],

            [[200, 200, 200],
            [200, 200, 200]]])])

Weight = np.array([0.25,0.75])

res = (Weight[:, np.newaxis, np.newaxis, np.newaxis] * A).sum(axis=0)

分辨率:

array([[[175., 175., 175.],
        [175., 175., 175.]],

       [[175., 175., 175.],
        [175., 175., 175.]]])

你需要有形状:

A.shape:

(2, 2, 2, 3)

重量.形状:

(2, 1, 1, 1)

【讨论】:

    猜你喜欢
    • 2013-01-08
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2016-11-10
    • 2015-01-24
    相关资源
    最近更新 更多