错误或异常是在程序执行期间发生的意外事件。它会影响程序指令的流程,并可能导致程序异常终止。
响应或处理异常称为异常处理。
NumPy 提供了多种方法来处理数组操作期间发生的异常。
处理 NumPy 中的浮点数错误
在 NumPy 中,seterr()
函数用于设置浮点数错误的处理方式。
它接受几个参数
divide
:指定除以零或无穷大的行为。over
:指定浮点数溢出的行为。under
:指定浮点数下溢的行为。invalid
:指定无效浮点数运算的行为,例如0/0、inf-inf和sqrt(-1)。
注意:所有这些参数的可能值为“ignore”
、“warn”
、“raise”
或“call”
。所有类型错误的默认行为都是“warn”
。
示例 1:NumPy seterr() 函数
import numpy as np
# set behavior for division by zero to 'raise'
np.seterr(divide='raise')
# divide array1 by array2
array1 = np.array([1, 2, 3])
array2 = np.array([0, 2, 0])
result = np.divide(array1, array2)
print(result)
输出
FloatingPointError: divide by zero encountered in true_divide
在此示例中,我们使用 np.seterr(divide='raise')
将除以零错误的默认行为设置为raise
。
这意味着当 np.divide()
在计算过程中遇到除以零时,它将引发 FloatingPointError
错误。
如果我们已将除以零的行为设置为
divide='ignore'
- 它不会引发错误或打印警告消息,输出将是[inf 1. inf]
。divide='warn'
- 它会打印警告消息并运行程序,输出将是[inf 1. inf]
。
示例 2:NumPy seterr() 函数中的 over 参数
import numpy as np
# set behavior for floating-point overflow to 'raise'
np.seterr(over='raise')
calc1 = np.exp(1000)
print(calc1)
输出
FloatingPointError: overflow encountered in exp
在上面的示例中,我们将浮点数溢出的行为设置为raise
。
然后我们计算了 np.exp(1000)
,这会导致浮点数溢出,因为计算结果对于浮点数数据类型来说太大了。
这将引发一个异常:FloatingPointError: overflow encountered in exp
。
注意:如果我们设置 np.seterr(under='raise')
并计算 np.exp(-1000)
,这将引发一个异常:FloatingPointError: underflow encountered in exp
。
示例 3:NumPy seterr() 函数中的 invalid 参数
在 Numpy 中,我们可以在 seterr()
中使用 invalid
参数,在发生无效浮点数运算时引发异常。例如,
import numpy as np
# set the invalid parameter to 'raise'
np.seterr(invalid='raise')
# try taking the square root of a negative number
x = np.sqrt(-1)
# Output: FloatingPointError: invalid value encountered in sqrt
在这里,我们尝试对 -1 取平方根,这是一个无效的浮点数运算。
由于我们将 invalid='raise'
设置为raise
,NumPy 将引发一个 FloatingPointError
。
NumPy try-catch 块
我们可以在 NumPy 中使用 try...except
块来处理错误。这是 try...except
的语法。
try:
# code that may cause exception
except:
# code to run when exception occurs
在这里,我们将可能引发异常的代码放在 try
块中。当 try
块中发生异常时,它会被 except
块捕获。
try
和 except
块必须协同工作以处理异常。
让我们看一个例子。
import numpy as np
array1 = np.array([1, 4, 3])
array2 = np.array([0, 2, 0])
# try to divide the arrays
try:
result = array1/array2
except ZeroDivisionError as e:
print("Error: Cannot divide by zero")
输出
runtimewarning: divide by zero encountered in divide