Python学习之——np.dot()与np.multiply()与*之间的区别

本文详细介绍了NumPy中dot、*及multiply三种运算的功能与应用场景,包括不同维度数组间的运算规则及broadcast机制,并对比了ndarray与matrix在运算上的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


part(一) dot运算

  • 如果 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
part(二) * 运算

对于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]])

part(三)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

### Python Numpy `np.dot` 函数详解 #### 功能描述 `np.dot` 是 NumPy 库中的一个重要函数,用于计算两个数组间的点积。对于二维数组而言,这相当于执行矩阵乘法;而对于一维数组,则是它们对应位置元素相乘后的求和操作[^1]。 #### 参数解释 该方法接受两个主要参数: - **a**: 输入的第一个数组。 - **b**: 输入的第二个数组。 此外还可以接收其他可选参数如 `out` 来指定输出缓冲区的位置[^2]。 #### 返回值 返回的是输入数组按规则计算得到的结果数组或标量值(当两者均为向量时)。如果第一个参数是一维而另一个不是,则会抛出错误提示不兼容的操作数形状[^4]。 #### 示例代码展示 下面通过具体例子来理解如何使用此功能: ```python import numpy as np # 一维数组之间做内积运算 vector_a = np.array([1, 2, 3]) vector_b = np.array([4, 5, 6]) result_vector_dot = vector_a @ vector_b # 或者使用 np.dot(vector_a, vector_b) print(f"Vector dot product result: {result_vector_dot}") # 输出应为 32 # 矩阵间进行标准矩阵乘法 matrix_c = np.mat([[1, 2], [3, 4]]) matrix_d = np.mat([[4, 5], [6, 7]]) result_matrix_multiply = matrix_c * matrix_d # 对于mat对象可以直接用*号代替dot() alternative_result = np.dot(matrix_c, matrix_d) print("Matrix multiplication results:") print(alternative_result) ``` 上述代码展示了两种不同类型的输入——向量矩阵下 `np.dot()` 的应用方式及其预期输出效果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值