两个不同维数矩阵的加法

2024-04-18 22:30:48 发布

您现在位置:Python中文网/ 问答频道 /正文

A是一个含有[m x n]元素的矩阵和B另一个含有[m x n x o]元素的矩阵。 有没有什么线性代数的方法可以把这两个矩阵相加,使得C = A + B,其中C将在[m x n x o]中,而不会沿着o维进行任何循环?在

示例:

A=

 1     2     5     6
 1     2     3     4
 1     5     8     9

以及

B(:,:,1)=

^{pr2}$

B(:,:,2)=

^{pr2}$

B(:,:,3)=

^{pr2}$

C=A+B

C(:,:,1)=

 2     3     6     7
 2     3     4     5
 2     6     9    10

C(:,:,2)=

 2     3     6     7
 2     3     4     5
 2     6     9    10

C(:,:,3)=

 2     3     6     7
 2     3     4     5
 2     6     9    10

Tags: 方法元素示例矩阵pr2
3条回答

这在Numpy中很容易实现:它将自动为您展开A。在

import numpy as np

a = np.array([[1, 2, 5, 6], [1, 2, 3, 4], [1, 5, 8, 9]])
print(a, end='\n\n')

b = np.ones((3, 3, 4), dtype='int32')
print(b, end='\n\n')

c = b + a
print(c)

输出

^{pr2}$

有关Numpy如何处理组合不同形状数组的详细信息,请参阅NumpyBroadcasting文档。在


无论b的内容是什么,该代码都可以工作,我只是使用了一个数组来匹配示例数据。但是,如果您只想让c成为一个mxnxo矩阵,通过展开a创建,然后将一个添加到您甚至不需要创建b的所有元素中;您可以这样做:

c = np.tile(a, (3, 1, 1)) + 1

在MATLAB中,这可以使用隐式展开(R2016b以后)或bsxfun(@plus,...)来完成。在

以下内容适用于所有最新的MATLAB版本:

C = bsxfun(@plus,A,B);

在纽比,这种行为被称为“广播”。在

您可以添加它们,说明缺少的(o)维度的位置。下面是一个使用numpy数组的python示例:

import numpy as np

>> arr_a = np.random.rand(2, 2)
array([[ 0.461715  ,  0.57055533],
   [ 0.16992256,  0.93994827]])

>> arr_b = np.random.rand(2, 2, 2)
array([[[ 0.71475233,  0.26140088],
    [ 0.1469756 ,  0.20147053]],

   [[ 0.18321165,  0.46292277],
    [ 0.07598337,  0.51653255]]])
# First generating an array with dimension [m * n * o], quickest to directly copy arr_b
>> arr_c = arr_b.copy()
# Placing array a in the zeroth column of the third dimension
>> arr_c[:, :, 0] += arr_a
array([[[ 1.17646733,  0.26140088],
    [ 0.71753093,  0.20147053]],

   [[ 0.35313422,  0.46292277],
    [ 1.01593163,  0.51653255]]])

相关问题 更多 >