numpy dot运算规则详解


  用numpy编程实现LinearRegression和LogisticRegression算法时,常用到dot方法计算cost函数和gradient,所以对dot需要准确的认识,才能够保证计算过程不出问题。
  numpy的dot方法,并不是传统意义上的点积或者说不仅仅是点积,如果你学过matlab,你会发现numpy的dot和matlab也有区别。因此,为了避免混淆这里给出numpy的dot方法常用计算和意义分析,帮助理解记忆。

1. numpy的向量和矩阵表示

  numpy在向量和矩阵表示上做的不好,不如Matlab明确。
  numpy的一维向量,其本质是一维数组,numpy默认将其作为行向量处理。
  要表示列向量,可通过reshape转换得到,本质上是一个二维数组,numpy把他当作一个矩阵处理。
如下所示:

>> a = np.array([1,2,3])
>> a
   array([1, 2, 3])
>> a.shape
   (3,) ### 3表示向量三个元素
>> a.T
   array([1, 2, 3])  ### 转置后依然是行向量


>> b = a.reshape(-1,  1)
>> b
   array([[1],
          [2],
          [3]])   ### 这种方式得到的列向量,其实已经是二维的矩阵,所以不能叫做1维的向量
>> b.shape
   (3, 1) 


>> c = b.T
>> c
   array([[1, 2, 3]])  ### 列向量转置得到了行向量,本质上是二维的矩阵
>> c.shape
   (1, 3)

2. 一维和一维数组的dot

  1. 行向量和行向量的点积
>> vec1 = np.array([1, 2, 3])
>> vec2 = np.array([1, 1, 1])
>> vec1.dot(vec2)
   6  ### 得到结果是一个标量,符合线性代数的向量点积定义
  1. 行向量和列向量点积
>> vec1 = np.array([1, 2, 3])
>> vec2 = np.array([1, 1, 1]).reshape(-1, 1)
>> vec1.dot(vec2)
   array([6])   ### 得到结果是一维数组(行向量),不再是标量,说明这个dot不再是线性代数意义上的点积,而是矩阵乘法
>> vec2.dot(vec1)
   ValueError: shapes (3,1) and (3,) not aligned: 1 (dim 1) != 3 (dim 0) ###果然报错了,因为矩阵乘法必须保证维度相容vec2 (3,1) 无法和vec1 (3,)相乘

综上,在numpy计算中,只有一维数组dot一维数组才符合数学定义,满足线性代数的向量点积。

3. 一维数组和二维矩阵的dot

行向量/列向量和矩阵dot,代码如下:

>> vec1 = np.array([1, 2, 3])
>> vec1
   array([1, 2, 3])

>> vec2 = vec1.reshape(-1, 1)
>> vec2
   array([[1],
          [2],
       	  [3]])

>> mat1 = np.array([[1, 2, 3],[1, 1, 1]])
>> mat1
   array([[1, 2, 3],
          [1, 1, 1]]) ### (2,3)矩阵

>> mat1.dot(vec1)
   array([14,  6])  ### (2,3)矩阵dot行向量,得到了一维行向量, 相当于(2,3) * (3,) = (2,) 

>> mat1.dot(vec2)
   array([[14],
          [ 6]])   ### (2,3)矩阵dot列向量,得到了二维列向量,相当于(2,3) * (3,1) = (2,1) 

>> vec1.dot(mat1) 
   ValueError: shapes (3,) and (2,3) not aligned: 3 (dim 0) != 2 (dim 0) ### (3,)*(2,3)不符合维度相容,报错

综上,一维和二维进行np.dot相当于矩阵乘法,必须满足维度相容。

4. 二维和二维矩阵的dot

矩阵和矩阵的dot运算,代码如下:

>> mat1 = np.array([[1, 2, 3],[1, 1, 1]])
>> mat1
   array([[1, 2, 3],
          [1, 1, 1]]) ### (2,3)矩阵

>> mat2 = np.array([[1,0],[1,1]])
>> mat2
   array([[1, 0],
          [1, 1]])

>> mat1.dot(mat2)
   ValueError: shapes (2,3) and (2,2) not aligned: 3 (dim 1) != 2 (dim 0)  ### 报错,维度不相容

>> mat1.T.dot(mat2)
   array([[2, 1],
          [3, 1],
          [4, 1]])  ### 本质上是矩阵相乘 (3,2) * (2,2) = (2,2)
   

综上,二维情况下,np.dot依然是矩阵乘法,必须满足维度相容。

5. 总结

  np.dot的运算规则:

  1. 只有一维数组(n,)之间的dot运算,是线性代数意义上的点积,计算结果维标量。
  2. 一维和多维以及多维和多维数组的dot运算,按照矩阵乘法进行运算,必须符合维度相容原则,计算结果为数组。
  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
NumPy是Python中用于科学计算的重要库之一,其中的ndarray对象能够高效处理大规模数组数据。下面介绍一些常见的numpy矩阵运算。 1. 创建矩阵 可以使用numpy中的array函数来创建矩阵,例如: ```python import numpy as np # 创建一个2x3的矩阵 A = np.array([[1, 2, 3], [4, 5, 6]]) ``` 2. 矩阵加法和减法 矩阵加法和减法需要两个矩阵形状相同,可以直接使用加法和减法运算符,例如: ```python import numpy as np A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) C = A + B # 矩阵加法 D = A - B # 矩阵减法 print(C) # [[ 6 8] # [10 12]] print(D) # [[-4 -4] # [-4 -4]] ``` 3. 矩阵乘法 矩阵乘法有两种方式:点积和矩阵乘法。点积是两个矩阵对应元素相乘再相加的结果,可以使用numpy中的dot函数实现。矩阵乘法是指两个矩阵的乘积,需要满足第一个矩阵的列数等于第二个矩阵的行数,可以使用numpy中的matmul函数实现。 ```python import numpy as np A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) # 点积 C = np.dot(A, B) # 矩阵乘法 D = np.matmul(A, B) print(C) # [[19 22] # [43 50]] print(D) # [[19 22] # [43 50]] ``` 4. 矩阵转置 可以使用numpy中的transpose函数或者T属性来将矩阵转置。 ```python import numpy as np A = np.array([[1, 2], [3, 4]]) # 转置 B = np.transpose(A) C = A.T print(B) # [[1 3] # [2 4]] print(C) # [[1 3] # [2 4]] ``` 这些是numpy中的常见矩阵运算,当然还有很多其他的操作,可以参考官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值