python中使用numpy包的向量矩阵相乘np.dot和np.matmul

这篇具有很好参考价值的文章主要介绍了python中使用numpy包的向量矩阵相乘np.dot和np.matmul。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一直对np的线性运算不太清晰,正好上课讲到了,做一个笔记整个理解一下 

1.向量和矩阵

在numpy中,一重方括号表示的是向量vector,vector没有行列的概念。二重方括号表示矩阵matrix,有行列。

np.matmul,python,numpy,矩阵

np.matmul,python,numpy,矩阵

代码显示如下:

import numpy as np
a=np.array([1,2,3])
a.shape
#(3,)
b=np.array([[1,2,3],[3,4,5]])
b.shape
#(2, 3)
c=np.array([[1],[2],[3]])
c.shape
#(3, 1)

即使[1,2,3]、[[1,2,3]]看起来内容一样 使用过程中也会有完全不一样的变化。下面以向量乘法为例解释。

2.向量和向量乘法

1.* 对应对应位置相乘

普通的*:在numpy里表示普通的对应位置相乘,注意相乘的两个向量、矩阵要保证维数相同

a1=np.array([1,2,3])
a2=np.array([1,2,3])
a1*a2
#array([1, 4, 9])

b1=np.array([[1,2,3]])
b2=np.array([[1,2,3]])
b1*b2
#array([[1, 4, 9]])

b1=np.array([[1,2,3],[3,4,5]])
b2=np.array([[1,2,3],[3,4,5]])
b1*b2
# array([[ 1,  4,  9],
#        [ 9, 16, 25]])

2.广播机制

如果单纯出现维数对不上,python会报error

b1=np.array([[1,2]])
b2=np.array([[1,2,3]])
b1*b2
#operands could not be broadcast together with shapes (1,2) (1,3) 

但是,还有一种情况会出现乘出来一个好大的矩阵,这个情况常出现在无意之中把行、列的数字搞反的情况下。被称为广播机制,需要两个乘子都有一个维数是1,如果是对不上且不为1就会报错

Numpy中的广播机制,你确定正确理解了吗? - 腾讯云开发者社区-腾讯云

在普通的对应位置相乘,会出现 

a1=np.array([1,2,3])
a3=np.array([[1],[2],[3]])
a1*a3#broadcast together
# array([[1, 2, 3],
#        [2, 4, 6],
#        [3, 6, 9]])

倒过来也会出现

a1=np.array([1,2,3])
a3=np.array([[1],[2],[3]])
a3*a1#broadcast together
# array([[1, 2, 3],
#        [2, 4, 6],
#        [3, 6, 9]])

3.向量点乘np.dot

必须要(行向量,列向量)形式的输入

a1=np.array([1,2,3])
a3=np.array([[1],[2],[3]])
np.dot(a3,a1)
#array([14])
#ValueError: shapes (3,1) and (3,) not aligned: 1 (dim 1) != 3 (dim 0)

 都是行向量,不行

b1=np.array([[1,2,3]])
b2=np.array([[1,2,3]])
np.dot(b1,b2) 
#shapes (1,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)

都是列向量,触发广播机制

a1=np.array([[1,2,3]])
a3=np.array([[1],[2],[3]])
np.dot(a3,a1)
# array([[1, 2, 3],
#        [2, 4, 6],
#        [3, 6, 9]])

3.矩阵和向量乘法

1.对应位置相乘

如果单纯采用*的方式进行矩阵和向量乘法,那就是广播机制

矩阵+向量

A1=np.array([[1,2,3],[2,3,4]])
b1=np.array([1,2,3])
A1*b1 #broadcast together
# array([[ 1,  4,  9],
#        [ 2,  6, 12]])

 对应的向量如果是矩阵形式,结果相同

A2=np.array([[1,2,3],[2,3,4]])
b2=np.array([[1,2,3]])
A2*b2 #broadcast together
# array([[ 1,  4,  9],
#        [ 2,  6, 12]])

相似的,如果维数对不上,不会触发广播机制

A3=np.array([[1,2,3],[2,3,4]])
b3=np.array([[1],[2],[3]])
A3*b3 #operands could not be broadcast together with shapes (2,3) (3,1) 

2.矩阵乘法

如果真正想要算矩阵*向量的矩阵乘法,要用np.dot

A4=np.array([[1,2,3],[2,3,4]])
b4=np.array([1,2,3])
np.dot(A4,b4)#dot product
#array([14, 20])

列向量也有类似结果

A4=np.array([[1,2,3],[2,3,4]])
b4=np.array([[1],[2],[3]])
np.dot(A4,b4)#dot product
# array([[14],
#        [20]])

4.矩阵矩阵乘法:

1.直接相乘

同样,也是对应位置相乘

A4=np.array([[1,2,3],[2,3,4]])
B4=np.array([[1,2,3],[4,5,6]])
A4*B4
# array([[ 1,  4,  9],
#        [ 8, 15, 24]])

 有广播机制

A4=np.array([[1,2,3],[2,3,4]])
B4=np.array([[1,2,3]])
A4*B4
# array([[ 1,  4,  9],
#        [ 2,  6, 12]])

2.np.dot:

需要第一个的列数和第二个的行数相对应

A4=np.array([[1,2,3],[2,3,4]])
B4=np.array([[1,2,3],[4,5,6]])
np.dot(A4,B4.T)
# array([[14, 32],
#        [20, 47]])

A5=np.array([[1,2,3],[2,3,4]])
B5=np.array([[1,2,3],[4,5,6],[7,8,9]])
np.dot(A5,B5)
# array([[30, 36, 42],
#        [42, 51, 60]])

对不上会报错

A4=np.array([[1,2,3],[2,3,4]])
B4=np.array([[1,2,3],[4,5,6]])
np.dot(A4,B4)
# shapes (2,3) and (2,3) not aligned: 3 (dim 1) != 2 (dim 0)

5.np.dot 和np.matmul的区别

Numpy中np.dot与np.matmul的区别_ACTerminate的博客-CSDN博客_numpy dot matmul

主要参考以上博客。

1.在二维(矩阵中),二者是一致的

2.在三维(张量中),二者有差别。

 以原博客中的例子为例

a = np.array([i for i in range(12)]).reshape([2,2,3])
b = np.array([i for i in range(12)]).reshape([2,3,2])
"""
a
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]]
b
[[[ 0  1]
  [ 2  3]
  [ 4  5]]

 [[ 6  7]
  [ 8  9]
  [10 11]]]
"""

np.dot很清晰,就是a的每一行分别和b的两层乘起来,于是2*2输出了四个“矩阵”(表示成4维的常数):


"""
a11= [ 0  1  2]
a12= [ 3  4  5]
a21= [ 6  7  8]
a22= [ 9 10 11]
b
[[[ 0  1]
  [ 2  3]
  [ 4  5]]

 [[ 6  7]
  [ 8  9]
  [10 11]]]
c[:,i,j]=aij*b
"""

如:

[ 10,  13] =[0 1 2]*[[ 0  1]
                                [ 2  3]
                                [ 4  5]]
  [ 28,  31]=[0 1 2]*[[ 6  7]
                                [ 8  9]
                                [ 10  11]]

>>> np.dot(a,b)
array([[[[ 10,  13],
         [ 28,  31]],

        [[ 28,  40],
         [100, 112]]],


       [[[ 46,  67],
         [172, 193]],

        [[ 64,  94],
         [244, 274]]]])
>>> np.dot(a,b).shape
(2, 2, 2, 2)

np.matmul的结果:

>>> np.matmul(a,b)
array([[[ 10,  13],
        [ 28,  40]],

       [[172, 193],
        [244, 274]]])
>>> np.matmul(a,b).shape
(2, 2, 2)

可以看出,如果把np.dot视为8行、matmul视为4行的话,matmul正好取第1、3、6、8四行,也就是第一层的前两行和第二层的后两行……

直观理解,ok文章来源地址https://www.toymoban.com/news/detail-823452.html

到了这里,关于python中使用numpy包的向量矩阵相乘np.dot和np.matmul的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 矩阵和向量如何相乘?

    矩阵与向量相乘遵循特定的数学规则,这个过程通常被称为矩阵向量乘法。在进行矩阵向量乘法时,矩阵的列数必须与向量的行数相同。以下是一个具体的例子: 例子: 假设我们有一个矩阵 A 和一个向量 v,其中: 在这个例子中,矩阵 A 是一个 3x2 矩阵(3行2列),向量v 是

    2024年01月22日
    浏览(34)
  • 【SIMULINK】simulink实现信号矩阵整合、求逆、转置、分解、向量矩阵相乘(非matlab)

    simulink实现信号矩阵,并实现分解 simulink实现信号矩阵求逆 simulink实现信号矩阵转置 simulink矩阵向量相乘

    2024年02月11日
    浏览(27)
  • 【理解线性代数】(四)从向量组点乘到矩阵相乘

    工业生产的发展趋势总是从单件生产到批量生产。科学技术研究也是一样,总是从简单计算到复合运算、批量运算。批量意味着生产能力、处理能力的提升。计算机从16位发展到64位,从单核发展到多核;计算机从CPU处理数据发展到GPU处理数据;大数据、人工智能领域的大模型

    2024年02月09日
    浏览(28)
  • 【易混区分】 tensor张量 Numpy张量的各种矩阵乘法、点积的函数对比 (dot, multiply,*,@matmul)

    又称为数量积、标量积(scalar product)或者内积(inner product) 它是指实数域中的两个向量运算得到一个实数值标量的二元运算。也就是对应元素的位置相乘 举例: 对于向量 a = ( x 1 , y 1 ) 和 b = ( x 2 , y 2 ) ,他们的点积就是 a ⋅ b = x 1 x 2 + y 1 y 2 a=(x_1,y_1)和b=(x_2,y_2),他们的点

    2024年01月25日
    浏览(36)
  • Python中Numpy的np.array详解

    np.array 用于创建一个新的NumPy数组对象。其语法如下: object :任何可用于初始化新数组的对象,例如列表、元组、数组等。 dtype :新数组的数据类型。如果未指定,则会从输入对象中推断数据类型。 其他参数允许进一步控制新数组的创建。 返回一个新的NumPy数组。 示例

    2024年02月08日
    浏览(38)
  • numpy np.savetxt()的使用

    前言 使用numpy将数据保存为txt文件,并且保留所需要的位数 X : 要保存的数据 fmt :  保留的有效数字位数 delimiter : 每列的填充字符 代码如下(示例):       输出为科学计数法: 如果要每列保存不同的格式怎么办?比如像下面这样  前三列要保留小数点后4位小数  后三列保

    2024年02月11日
    浏览(31)
  • 系统学习Numpy(一)——numpy的安装与基础入门[向量、矩阵]

    numpy的安装与基础入门[向量、矩阵与维度] numpy是科学计算以及机器学习深度学习的基础必备工具,本文将介绍numpy的安装,以及关于向量、矩阵相关的基础知识。 在conda下使用 conda install numpy 安装。 如果没有conda可以使用 pip install numpy 安装。 我们将使用 import numpy as np 对nu

    2024年02月16日
    浏览(24)
  • 玩转Numpy——np.ravel()的使用

    numpy中的ravel函数的作用是让多维数组变成一维数组 numpy.ravel() 下面演示一下二维和三维数组的ravel操作,多维数组的ravel操作与其类似 eg:  ravel函数的功能是将原数组拉伸成为一维数组 建议收藏,以便下次查阅方便

    2024年02月13日
    浏览(28)
  • NumPy之矩阵、向量、线性代数等的操作

    在NumPy中,矩阵可以看作是一个二维数组,其中每个元素都可以通过行列坐标来定位。它表示为一个m×n的矩形网格,其中m表示矩阵的行数,n表示矩阵的列数。在计算机科学中,矩阵通常用数字或符号表示,并且可以进行加、减、乘等运算。 一个 M X N 的矩阵是一个由 M 行(

    2024年02月02日
    浏览(32)
  • Python,Numpy中随机抽样的函数 np.random.choice()详解

    np.random.choice() 是NumPy库中的一个函数,用于从给定的一维数组或可迭代对象中随机抽样。这个函数具有以下参数和功能: 参数 a :表示从中抽取随机样本的数组或整数。如果 a 是一个整数,则抽样将从 np.arange(a) 中进行。 size :输出样本的大小。默认情况下,返回单个值。你

    2024年02月06日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包