zoukankan      html  css  js  c++  java
  • Numpy数据的操作 * dot() multiply() 的区别

    使用numpy时,跟matlab不同:

    1、* dot() multiply()

    对于array来说,* 和 dot()运算不同

    *是每个元素对应相乘

    dot()是矩阵乘法

    对于matrix来说,* 和 multiply() 运算不同

    * 是矩阵乘法

    multiply()  是每个元素对应相乘

    A B为array   MA MB为matrix

    multiply(MA, MB)对应元素相乘

    dot(MA, MB)矩阵乘法

    注意:对应元素相乘时,矩阵大小必须相同;矩阵相乘时,矩阵大小要满足矩阵相乘要求。

     
     
     

    dot运算

    numpy官方文档上所写:

    • 如果 a和 b都是 1-D arrays,它的作用是计算内积。(不进行复共轭)
    >>> np.dot(3, 4)
    12
    
    >>> np.dot([2j, 3+3j], [2j, 3j])
    (-13+9j)
    
    • 如果 a和 b是 2-D arrays, 作用是矩阵的乘积, a和 b的维数要满足矩阵乘积维数要求,此时推荐使用 matmul或 a @ b
    >>> a = [[1, 0], [0, 1]]
    >>> b = [[4, 1], [2, 2]]
    >>> np.dot(a, b)
    array([[4, 1],
           [2, 2]])
    
    • 如果 a或 b是 0-D (标量), 等价于 multiply,推荐使用 numpy.multiply(a, b)或 a * b
    • 如果 a是 N-D array 且 b是 1-D array, 作用是在a和 b的最后一个轴上进行sum product运算。
    >>> a = array([[[ 1.,  2.,  3.,  4.],
              [ 5.,  6.,  7.,  8.],
              [ 9., 10., 11., 12.]],
    
             [[ 1.,  2.,  3.,  4.],
              [ 5.,  6.,  7.,  8.],
              [ 9., 10., 11., 12.]]])
    >>> b = np.array([1,2,3,4])
    >>>np.dot(a, b)
    
    array([[ 30.,  70., 110.],
           [ 30.,  70., 110.]])
    
    • 如果a是 N-D array 且 b是 M-D array (M>=2), 作用是在a的最后一个轴上和b的倒数第二个轴上进行sum product,即 :
    dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
    
    >>> a = np.arange(3*4*5*6).reshape((3,4,5,6))
    >>> b = np.arange(3*4*5*6)[::-1].reshape((5,4,6,3))
    >>> np.dot(a, b)[2,3,2,1,2,2]
    499128
    >>> sum(a[2,3,2,:] * b[1,2,:,2])
    499128
    

    *运算

    对于ndarray, * 作用的是进行element-wise乘积,必要时需要broadcast,作用同np.multipy

    >>> a = np.array(range(6)).reshape((2,3))                                                                                                                                                                     
    >>> b = np.array([1,0,1])
    >>> a
    array([[0, 1, 2],
           [3, 4, 5]])
    >>> b
    array([1, 0, 1])
    >>> c= a*b
    >>> c
    array([[0, 0, 2],
           [3, 0, 5]])
    >>> d = a*b.T
    >>> d
    array([[0, 0, 2],
           [3, 0, 5]])
    

    而对于matrix,* 则表示矩阵相乘,运算必须保证矩阵相乘的法则:

    >>> A=np.matrix(a)
    >>> B=np.matrix(b)
    >>> A
    matrix([[0, 1, 2],
            [3, 4, 5]])
    >>> B
    matrix([[1, 0, 1]])
    >>> C=A*B
    ValueError: shapes (2,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)
    #维数不匹配
    >>> C=A*B.T
    >>> C
    matrix([[2],
            [8]])
    

    multiply运算

    函数原型是

    numpy.multiply(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj]) = <ufunc 'multiply'>
    

    Returns:
    y : ndarray
    x1 和 x2的element-wise乘积,保证x1和x2有相同的维数,或者进行broadcast之后两者有相同的维数

    >>> np.multiply(2.0, 4.0)
    8.0
    
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> np.multiply(x1, x2)
    array([[  0.,   1.,   4.],
           [  0.,   4.,  10.],
           [  0.,   7.,  16.]])
    #要进行broadcast
    
     



     
  • 相关阅读:
    安装Django、Nginx和uWSGI
    创建Orcale数据库链接访问外部数据库
    ER图,以及转化成关系模式
    eclipse中的Java项目导出成为一个可以直接双击运行的jar文件
    电脑添加新的字体
    JDBC 的编程步骤
    转转基础服务性能压测实战
    公司起诉CTO拖延研发进度,索赔90万
    详解MQ消息队列及四大主流MQ的优缺点
    晒一波程序员的杯子,逼格超级高
  • 原文地址:https://www.cnblogs.com/AlvinSui/p/8733470.html
Copyright © 2011-2022 走看看