NumPy.dot()与Python中’*’操作的区别

  • Post category:Python

NumPy是Python中的一个重要的科学计算库,它提供了很多与向量、矩阵计算相关的操作,其中包括许多用于矩阵乘法操作的函数,比如np.dot()。与此同时,Python自带的’‘操作也可以用来进行矩阵乘法操作。在这里,我们将深入探讨NumPy.dot()和Python中’‘操作的区别。

NumPy.dot()与Python中的’*’操作有什么区别?

NumPy.dot()和Python中的’*’操作(或者说’@’符号)都能够进行矩阵乘法操作,但是它们有一些不同之处。

  1. 形状不同的矩阵

当两个矩阵A和B的形状不同时,NumPy.dot()和Python中的’*’操作会得到不同的结果。

NumPy.dot()函数要求输入的两个数组A和B必须满足矩阵乘法的投影规则,也就是说B的第一维的长度必须和A的第二维的长度相等。如果输入的矩阵不符合这个规则,NumPy.dot()会抛出一个ValueError的异常。

Python中的’*’操作对于形状不同的矩阵也能够进行乘法操作。在这种情况下,Python会将矩阵A和B转换为数组对象进行操作。这种转换涉及到了广播(broadcasting)规则,这让你可以更加方便地进行矩阵乘法操作。

下面是一个示例,其中展示了当矩阵A和B拥有不同形状时,NumPy.dot()与Python中’*’操作返回结果的不同:

import numpy as np

# 创建两个形状不同的矩阵,一个是2x3的,另一个是3x2的
A = np.array([[1,2,3], [4,5,6]])
B = np.array([[1,2], [3,4], [5,6]])

# 使用NumPy.dot()计算A和B的乘积
C = np.dot(A, B)
print("使用NumPy.dot()计算:\n", C)

# 使用Python中'*'操作计算A和B的乘积
D = A * B
print("使用Python中的'*'操作计算:\n", D)

运行上面代码的输出结果为:

Traceback (most recent call last):
  File "main.py", line 9, in <module>
    C = np.dot(A, B)
  File "<__array_function__ internals>", line 5, in dot
ValueError: shapes (2,3) and (3,2) not aligned: 3 (dim 1) != 2 (dim 0)

可以看到,NumPy.dot()抛出了一个ValueError的异常,这是因为A的第二维长度为3,而B的第一维长度为3,不满足投影规则。

而Python中’*’操作返回的结果是两个矩阵对应位置的乘积,这是因为Python会将A和B转换成一个3×3的矩阵,然后按照对应位置进行乘法计算,这里不满足矩阵乘法的投影规则。

使用Python中的'*'操作计算:
 [[ 1  4  9]
 [12 20 30]]
  1. 广播规则

当两个矩阵的形状相同,但是它们的维度数不同时,NumPy.dot()和Python中的’‘操作仍然会返回不同的结果。这是因为,当进行矩阵乘法操作时,NumPy.dot()函数要求输入的数组必须至少有二维,而Python中的’‘操作则没有这个限制。

在这种情况下,Python中’*’操作使用了广播规则。广播是一种可以让不同形状的数组进行一系列计算的机制。如果两个数组的形状不同,NumPy会自动使用广播规则,以满足矩阵乘法的要求。

下面是一个示例,其中展示了当A和B的形状相同,但是A是一维数组而B是二维数组时,NumPy.dot()与Python中’*’操作返回结果的不同:

import numpy as np

# 创建两个维度不同的数组,一个是长度为3的一维数组,另一个是3x3的二维数组
A = np.array([1, 2, 3])
B = np.array([[1,2,3], [4,5,6], [7,8,9]])

# 使用NumPy.dot()计算A和B的乘积
C = np.dot(A, B)
print("使用NumPy.dot()计算:\n", C)

# 使用Python中'*'操作计算A和B的乘积
D = A * B
print("使用Python中的'*'操作计算:\n", D)

运行上面代码的输出结果为:

使用NumPy.dot()计算:
 [30 36 42]

使用Python中的'*'操作计算:
 [[ 1  4  9]
 [ 4 10 18]
 [ 7 16 27]]

可以看到,NumPy.dot()函数计算的是一个长度为3的一维数组和一个3×3的二维数组之间的矩阵乘积,返回的结果是一个长度为3的一维数组。而Python中’*’操作直接对A和B的对应位置进行乘法计算,得到的结果是一个3×3的矩阵。

总之,NumPy.dot()和Python中’*’操作都是进行矩阵乘法操作的重要方式,但是它们在处理矩阵乘法时所遵循的规则是不同的,在使用的过程中需要注意。