NumPy 数组除法



NumPy 数组除法

NumPy 数组除法是指对两个数组进行逐元素除法的过程。在此上下文中,逐元素除法意味着一个数组中的每个元素都除以另一个数组中对应的元素。

此操作支持广播,允许对不同形状的数组进行除法。此外,可以在数组和标量之间执行除法,这将相应地缩放数组的每个元素。

NumPy 中的逐元素除法

NumPy 中的逐元素除法是指将一个数组的每个元素除以另一个数组中对应的元素。此操作逐元素执行,这意味着除法在两个数组中相同位置的元素之间成对发生。

为了使逐元素除法能够工作,两个数组必须具有相同的形状,或者它们必须能够广播到一个公共形状。

在 NumPy 中,除法运算符 / 用于执行逐元素除法。如果数组具有不同的形状但对于广播是兼容的,NumPy 将自动应用广播规则来执行除法。

示例

在下面的示例中,我们将数组 a 的每个元素除以数组 b 中对应的元素:

import numpy as np

# Creating two arrays
a = np.array([10, 20, 30])
b = np.array([2, 5, 10])

# Performing element-wise division
result = a / b
print(result)

以下是获得的输出:

[5. 4. 3.]

NumPy 中的标量除法

NumPy 中的标量除法是指将数组的每个元素除以单个标量值。此操作将除法应用于数组的每个元素,从而产生一个新数组,其中每个元素都除以标量。

示例

在这个例子中,我们将数组“a”的每个元素除以标量“10”:

import numpy as np

# Creating an array
a = np.array([10, 20, 30])

# Dividing by a scalar
result = a / 10
print(result)

这将产生以下结果:

[1. 2. 3.]

数组除法中的广播

广播允许对不同形状的数组进行运算。当对不同形状的数组执行除法时,NumPy 会自动调整形状以便可以执行该运算。

在执行数组除法时,广播允许您通过自动沿缺失维度扩展较小的数组以匹配较大数组的形状来除不同大小或形状的数组。

这种扩展以允许逐元素运算(如除法)在不显式复制数据的情况下执行的方式进行。

示例

在下面的示例中,数组“b”被广播以匹配数组“a”的形状,然后执行逐元素除法:

import numpy as np

# Creating arrays with different shapes
a = np.array([[10, 20, 30], [40, 50, 60]])
b = np.array([10, 5, 2])

# Performing division with broadcasting
result = a / b
print(result)

以下是上述代码的输出:

[[ 1.  4. 15.]
 [ 4. 10. 30.]]

处理除以零

在 NumPy 中执行除法运算时,一个常见问题是可能除以零,这可能导致未定义或无限的结果。NumPy 提供了处理此类情况的方法,可以通过返回特殊值(如 inf 或 nan)或根据具体用例引发警告或错误来实现。

  • 正/负无穷大 (inf 或 -inf) − 当正数或负数除以零时返回。
  • 非数字 (nan) − 当零除以零时返回。

示例:基本的除以零

让我们看看 NumPy 如何处理简单的除以零:

import numpy as np

# Creating an array with a zero element
array = np.array([10, 0, -5])

# Dividing a constant by the array
result = 100 / array
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

# Creating an array with a zero element
array = np.array([10, 0, -5])

with 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

# Creating arrays with zero elements
numerator = np.array([0, 1, 2])
denominator = np.array([0, 0, 2])

# Performing division
result = numerator / denominator
print(result)

产生的结果如下:

[ 10.  inf -20.]

不同数据类型的除法

当对不同数据类型的数组执行除法时,NumPy 会自动将数据类型提升到可以安全地包含结果的公共类型。

例如,如果您将整数数组除以浮点数组,则结果将是浮点数组。这种类型提升可以防止数据丢失并确保结果的精度。

示例

在此示例中,NumPy 在执行除法之前将整数数组 a 提升为浮点类型以匹配数组 b 的数据类型:

import numpy as np

# Creating arrays with different data types
a = np.array([10, 20, 30], dtype=np.int32)
b = np.array([2.5, 5.0, 10.0], dtype=np.float64)

# Performing division
result = a / b
print(result)

我们得到如下所示的输出:

[4. 4. 3.]

NumPy 中的矩阵除法

矩阵除法不像逐元素除法或标量除法那样简单。但是,您可以使用 NumPy 中矩阵的逆矩阵进行矩阵乘法来解决类似矩阵除法的运算。

示例

在此示例中,我们使用矩阵 B 的逆矩阵在 NumPy 中执行类似除法的运算:

import numpy as np

# Creating a matrix
A = np.array([[1, 2], [3, 4]])

# Creating another matrix
B = np.array([[2, 0], [1, 3]])

# Solving the matrix division A/B
# Equivalent to 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

# Creating arrays with incompatible shapes
a = np.array([1, 2, 3])
b = np.array([[1, 2], [3, 4]])

# Attempting to divide incompatible arrays
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) 
广告