NumPy - 数组除法
NumPy 数组除法
NumPy 数组除法是指按元素对两个数组进行除法。在这种情况下,按元素除法意味着将一个数组中的每个元素除以另一个数组中的对应元素。
此操作支持广播,允许在不同形状的数组之间进行除法。此外,还可以在数组和标量之间进行除法,从而对数组中的每个元素进行相应的缩放。
NumPy 中的按元素除法
NumPy 中的按元素除法是指将一个数组中的每个元素除以另一个数组中的对应元素。此操作逐个元素执行,这意味着除法在两个数组的相同位置的元素之间成对发生。
要使逐元素除法起作用,两个数组必须具有相同的形状,或者它们必须可以广播为共同的形状。
在 NumPy 中,除法运算符 / 用于执行逐元素除法。如果数组形状不同但兼容广播,NumPy 将自动应用广播规则执行除法。
示例
在下面的示例中,我们将数组 a 的每个元素除以数组 b 的对应元素 -
import numpy as np # 创建两个数组 a = np.array([10, 20, 30]) b = np.array([2, 5, 10]) # 执行逐元素除法 result = a / b print(result)
以下是得到的输出 -
[5. 4. 3.]
NumPy 中的标量除法
NumPy 中的标量除法是指将数组的每个元素除以一个标量值。此操作将除法应用于数组的每个元素,从而生成一个新数组,其中每个元素都除以标量。
示例
在此示例中,我们将数组"a"的每个元素除以标量"10" -
import numpy as np # 创建数组 a = np.array([10, 20, 30]) # 除以标量 result = a / 10 print(result)
这将产生以下结果 -
[1. 2. 3.]
数组除法中的广播
广播允许在不同形状的数组之间进行运算。在不同形状的数组之间执行除法时,NumPy 会自动调整数组形状,以便执行除法运算。
执行数组除法时,广播功能允许您通过自动沿缺失维度扩展较小数组以匹配较大数组的形状,从而划分不同大小或形状的数组。
这种扩展方式允许执行逐元素运算(例如除法),而无需显式复制数据。
示例
在下面的示例中,数组"b"被广播以匹配数组"a"的形状,然后执行逐元素除法 -
import numpy as np # 创建不同形状的数组 a = np.array([[10, 20, 30], [40, 50, 60]]) b = np.array([10, 5, 2]) # 使用广播执行除法 result = a / b print(result)
以下是上述代码的输出 -
[[ 1. 4. 15.] [ 4. 10. 30.]]
处理除以零
在 NumPy 中执行除法运算时,一个常见问题是除以零的可能性,这可能导致未定义或无限的结果。 NumPy 提供了处理此类情况的方法,要么返回特殊值(例如 inf 或 nan),要么根据具体用例引发警告或错误。
- 正无穷/负无穷(inf 或 -inf)− 当正数或负数除以零时返回。
- 非数 (nan) − 当零除以零时返回。
示例:基本除以零
让我们看看 NumPy 如何处理简单的除以零 −
import numpy as np # 创建一个包含零元素的数组 array = np.array([10, 0, -5]) # 将常量除以数组 结果= 100 / 数组 print(result)
NumPy 不会引发错误,而是在除以零时返回"inf" -
/home/cg/root/66c57b63ef7f5/main.py:7: RuntimeWarning: divide by zero encountered in divide result = 100 / array [ 10. inf -20.]
示例:使用 errstate() 函数处理除零
您可以使用 np.errstate() 函数控制 NumPy 如何处理除零。此函数允许您指定对除零等浮点错误是忽略、发出警告还是引发错误 -
import numpy as np # 创建一个包含零元素的数组 array = np.array([10, 0, -5]) 使用 np.errstate(divide='ignore', invalid='ignore'): result = 100 / array print(result)
在这里,我们将 errstate() 函数中的"divide"参数设置为"ignore",以忽略除零时通常会出现的警告。结果仍然包含"inf",但没有任何中断或警告 −
/home/cg/root/66c57b63ef7f5/main.py:7: RuntimeWarning: divide by zero encountered in divide result = 100 / array [ 10. inf -20.]
示例:处理 nan 值
零除以零时,结果为 nan(非数字)。此特殊值用于表示浮点计算中未定义或不可表示的值 -
import numpy as np # 创建包含零个元素的数组 numerator = np.array([0, 1, 2]) denominator = np.array([0, 0, 2]) # 执行除法 result = numerator / denominator print(result)
结果如下 -
[ 10. inf -20.]
不同数据类型的除法
当对不同数据类型的数组执行除法时,NumPy 会自动将数据类型提升为可以安全保存结果的通用类型。
例如,如果对一个整数进行除法数组乘以浮点数组,结果将是一个浮点数组。这种类型提升可以防止数据丢失,并确保结果的精度。
示例
在此示例中,NumPy 在执行除法之前将整数数组 a 提升为浮点类型,以匹配数组 b 的数据类型 -
import numpy as np # 创建具有不同数据类型的数组 a = np.array([10, 20, 30], dtype=np.int32) b = np.array([2.5, 5.0, 10.0], dtype=np.float64) # 执行除法 result = a / b print(result)
我们得到如下所示的输出 -
[4. 4. 3.]
NumPy 中的矩阵除法
矩阵除法不像元素除法或标量除法那么简单。但是,在 NumPy 中,你可以使用矩阵乘法和矩阵的逆来求解类似矩阵除法的运算。
示例
在本例中,我们使用矩阵 B 的逆在 NumPy 中执行类似除法的运算 -
import numpy as np # 创建矩阵 A = np.array([[1, 2], [3, 4]]) # 创建另一个矩阵 B = np.array([[2, 0], [1, 3]]) # 求解矩阵除法 A/B # 等价于 A * B^-1 result = np.dot(A, np.linalg.inv(B)) print(result)
以下得到的输出为 −
[[0.16666667 0.66666667] [0.83333333 1.33333333]]
处理除法中的维度不匹配
在 NumPy 中对数组执行除法运算时,如果数组不共享兼容的形状,则可能会出现维度不匹配的情况。 NumPy 通过广播解决了这个问题,并在这种情况下引发 ValueError。
示例
在以下示例中,形状"a"和"b"与广播不兼容,导致错误 -
import numpy as np # 创建形状不兼容的数组 a = np.array([1, 2, 3]) b = np.array([[1, 2], [3, 4]]) # 尝试对不兼容的数组进行除法运算 result = a / b print(result)
生成的结果如下 -
Traceback (most recent call last): File "/home/cg/root/66c57b63ef7f5/main.py", line 8, in <module> result = a / b ValueError: operands could not be broadcast together with shapes (3,) (2,2)