Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 矩阵NumPy数组的元素乘法_Python_Arrays_Performance_Numpy_Matrix - Fatal编程技术网

Python 矩阵NumPy数组的元素乘法

Python 矩阵NumPy数组的元素乘法,python,arrays,performance,numpy,matrix,Python,Arrays,Performance,Numpy,Matrix,我有两个NumPy数组(长度相等),每个数组的元素是(大小相等的正方形)NumPy矩阵。我想对这两个数组进行元素矩阵乘法,即返回一个数组,其中第I个元素是两个数组的第I个元素的矩阵积 当我简单地尝试将数组相乘时,程序似乎试图计算数组的矩阵积,然后失败,因为它们的维数太高(数组为1,矩阵为其元素为2) 这个问题当然可以用for循环来解决,但我希望有一种方法可以让一切都在NumPy内部,以便充分利用它提高的效率 编辑: 为了澄清,假设我有两个数组np.array([A,B,C])和np.array(

我有两个NumPy数组(长度相等),每个数组的元素是(大小相等的正方形)NumPy矩阵。我想对这两个数组进行元素矩阵乘法,即返回一个数组,其中第I个元素是两个数组的第I个元素的矩阵积

当我简单地尝试将数组相乘时,程序似乎试图计算数组的矩阵积,然后失败,因为它们的维数太高(数组为1,矩阵为其元素为2)

这个问题当然可以用for循环来解决,但我希望有一种方法可以让一切都在NumPy内部,以便充分利用它提高的效率

编辑:


为了澄清,假设我有两个数组
np.array([A,B,C])
np.array([X,Y,Z])
其中
A
B
C
Y
Z
都是3x3个方阵,我需要的是一个返回
np.array([A*X,B*Y,C*Z])
,其中,
*
是矩阵乘法。
*
在numpy中将执行元素操作,即:

>>> a
array([[[0.86812606, 0.16249293, 0.61555956],
        [0.12381998, 0.84800823, 0.80731896],
        [0.56910074, 0.4071833 , 0.069167  ]],

       [[0.69742877, 0.45354268, 0.7220556 ],
        [0.86638233, 0.97552151, 0.85580334],
        [0.01171408, 0.35997806, 0.72999056]]])

>>> b
array([[[0.17162968, 0.52103661, 0.05433799],
        [0.19999652, 0.01852179, 0.7936977 ],
        [0.22392469, 0.34535168, 0.92808129]],

       [[0.7044144 , 0.03183893, 0.16469416],
        [0.6214784 , 0.57722859, 0.23789282],
        [0.934214  , 0.61396596, 0.5356328 ]]])

>>> a * b
array([[[0.1489962 , 0.08466477, 0.03344827],
        [0.02476357, 0.01570663, 0.6407672 ],
        [0.12743571, 0.14062144, 0.06419259]],

       [[0.49127887, 0.01444031, 0.11891834],
        [0.5384379 , 0.5630989 , 0.20358947],
        [0.01094346, 0.22101428, 0.39100689]]])

这不是您要找的吗?

*
在numpy中将执行元素操作,即:

>>> a
array([[[0.86812606, 0.16249293, 0.61555956],
        [0.12381998, 0.84800823, 0.80731896],
        [0.56910074, 0.4071833 , 0.069167  ]],

       [[0.69742877, 0.45354268, 0.7220556 ],
        [0.86638233, 0.97552151, 0.85580334],
        [0.01171408, 0.35997806, 0.72999056]]])

>>> b
array([[[0.17162968, 0.52103661, 0.05433799],
        [0.19999652, 0.01852179, 0.7936977 ],
        [0.22392469, 0.34535168, 0.92808129]],

       [[0.7044144 , 0.03183893, 0.16469416],
        [0.6214784 , 0.57722859, 0.23789282],
        [0.934214  , 0.61396596, 0.5356328 ]]])

>>> a * b
array([[[0.1489962 , 0.08466477, 0.03344827],
        [0.02476357, 0.01570663, 0.6407672 ],
        [0.12743571, 0.14062144, 0.06419259]],

       [[0.49127887, 0.01444031, 0.11891834],
        [0.5384379 , 0.5630989 , 0.20358947],
        [0.01094346, 0.22101428, 0.39100689]]])
这不是您要寻找的吗?

操作符在默认情况下对于
numpy
数组是“元素明智的”。只需使用
@
运算符(矩阵乘法)而不是
*

In [24]: A = np.arange(9).reshape(3,3)

In [25]: X = np.array([A[:], A[:]*2, A[:]*3])

In [26]: Y = X[:]

In [27]: X @ Y
Out[27]:
array([[[ 15,  18,  21],
        [ 42,  54,  66],
        [ 69,  90, 111]],

       [[ 60,  72,  84],
        [168, 216, 264],
        [276, 360, 444]],

       [[135, 162, 189],
        [378, 486, 594],
        [621, 810, 999]]])

In [28]: X[0] @ Y[0]
Out[28]:
array([[ 15,  18,  21],
       [ 42,  54,  66],
       [ 69,  90, 111]])

In [29]: X[1] @ Y[1]
Out[29]:
array([[ 60,  72,  84],
       [168, 216, 264],
       [276, 360, 444]])

In [30]: X[2] @ Y[2]
Out[30]:
array([[135, 162, 189],
       [378, 486, 594],
       [621, 810, 999]])
HTH.

默认情况下,对于
numpy
数组,运算符是“按元素”的。只需使用
@
运算符(矩阵乘法)而不是
*

In [24]: A = np.arange(9).reshape(3,3)

In [25]: X = np.array([A[:], A[:]*2, A[:]*3])

In [26]: Y = X[:]

In [27]: X @ Y
Out[27]:
array([[[ 15,  18,  21],
        [ 42,  54,  66],
        [ 69,  90, 111]],

       [[ 60,  72,  84],
        [168, 216, 264],
        [276, 360, 444]],

       [[135, 162, 189],
        [378, 486, 594],
        [621, 810, 999]]])

In [28]: X[0] @ Y[0]
Out[28]:
array([[ 15,  18,  21],
       [ 42,  54,  66],
       [ 69,  90, 111]])

In [29]: X[1] @ Y[1]
Out[29]:
array([[ 60,  72,  84],
       [168, 216, 264],
       [276, 360, 444]])

In [30]: X[2] @ Y[2]
Out[30]:
array([[135, 162, 189],
       [378, 486, 594],
       [621, 810, 999]])

HTH.

请提供数据示例。如果将阵列描述为
(n,3,3)
形状,可能会有所帮助。在提供
@
np.matmul
)之前,最好的解决方案是:
np.einsum('ijk,ikl->ijl',[A,B,C],[X,Y,Z])
。作为表达和可视化复杂矩阵产品的一种方式,它仍然很有用。请提供数据示例。如果您将数组描述为
(n,3,3)
形状,它可能会有所帮助。在提供
@
np.matmul
)之前,最好的解决方案是:
np.einsum('ijk,ikl->ijl',[A,B,C],[X,Y,Z])
。作为一种表达和可视化复杂矩阵产品的方式,它仍然很有用。不,理想的结果是使用一个数组,其中元素是输入数组中矩阵的矩阵产品,而不是元素产品。如果不清楚,我很抱歉。不,理想的结果是有一个数组,其中元素是我输入数组中矩阵的矩阵积,而不是元素积。如果不清楚的话,我道歉。