Skip to main content

通用函数与特殊值

NumPy 提供了一批对数组逐元素运算的函数,以及 NaN/Inf 等特殊浮点值的处理方式。


单参数通用函数

a = np.array([-4, -2, 0, 2, 4])

np.abs(a) # [4 2 0 2 4] —— 绝对值
np.sqrt(a) # 平方根(负数 → NaN)
np.square(a) # 平方
np.exp(a) # e 的幂
np.log(a) # 对数

取整函数

NumPy 支持四种取整方式:

a = np.array([-1.7, -1.2, 0.5, 1.2, 1.7])

np.floor(a) # [-2. -2. 0. 1. 1.] —— 向下取整
np.ceil(a) # [-1. -1. 1. 2. 2.] —— 向上取整
np.trunc(a) # [-1. -1. 0. 1. 1.] —— 向零取整(截断小数部分)
np.round(a) # [-2. -1. 0. 1. 2.] —— 四舍五入

四种取整方向图解:

-2 -1 0 1 2
|--------|--------|--------|--------|
↑-1.7 ↑0.5 ↑1.7
↑-1.2 ↑1.2

floor: ↓ ↓ ↓ (往更小的方向)
ceil: ↓ ↓ ↓ (往更大的方向)
trunc: ↓ ↓ ↓ (往零靠拢)
round: ↓ ↓ ↓ ↓ (四舍五入,.5往绝对值大的方向)

分离整数与小数

np.modf([1.5, 2.7, 3.1])
# (array([0.5, 0.7, 0.1]), array([1., 2., 3.]))
# 返回 (小数部分, 整数部分) 两个数组

两数组运算

a = np.array([3, 7, 2, 9])
b = np.array([5, 2, 8, 4])

np.maximum(a, b) # [5 7 8 9] —— 逐位置取最大值
np.minimum(a, b) # [3 2 2 4] —— 逐位置取最小值

这与 a.max() / b.max() 不同——后者返回整个数组的最大值(一个数),maximum 返回逐位置比较的结果(一个数组)。


特殊值:NaN(Not a Number)

出现场景:0/0、负数的平方根、np.nan 本身

a = np.arange(5)
b = a / a # [nan, 1., 1., 1., 1.] —— 0÷0 = NaN

# 核心陷阱:NaN 不等于任何值,包括它自己!
np.nan == np.nan # False! ← 极少数不等于自身的值

# 必须用 np.isnan 判断
np.isnan(b) # [True, False, False, False, False]
b[~np.isnan(b)] # [1. 1. 1. 1.] —— 过滤掉 NaN

为什么 0/0 不直接报错?大数据集中可能只有少量除零情况,报错会让整个计算中断——用 NaN 标记异常值更合理。


特殊值:Inf(Infinity,无穷大)

出现场景:非零数 ÷ 0

a = np.array([4, 5, 6, 7])
b = np.array([0, 1, 0, 2])
a / b # [inf, 5., inf, 3.5]

# 判断和过滤
np.isinf(a / b) # [True, False, True, False]
result = a / b
result[result != np.inf] # [5., 3.5]

# inf 比任何数都大
np.inf > 999999999 # True