用Python计算自然对数

使用math.log计算标准 Python 代码中数字的自然对数(以 e 为底),然后切换到numpy.log当您想要对数组进行快速、矢量化操作时。两者都默认返回ln; NumPy还接受类似数组的输入和复数值。

方法 1 — 使用数学模块(标量)计算 ln

步骤一:导入数学模块。

import math

步骤2:使用以下方法计算正数的自然对数math.log(x).

x = 2.0
print(math.log(x))        # 0.6931471805599453

步骤3:需要时提供第二个参数来计算另一个底数的对数。

print(math.log(100, 10))   # 2.0 (log base 10 of 100)

第4步:防止非正输入,这会导致ValueError.

def safe_ln(v: float) -> float:
    if v <= 0:
        raise ValueError("ln is undefined for non-positive values.")
    return math.log(v)

print(safe_ln(1.0))       # 0.0

提示:对于非常接近零的值,math.log1p(x)为 ln(1+x) 提供更好的精度。


选项 2 — 使用 NumPy 计算 ln(标量、列表、ndarray)

步骤一:导入 NumPy。

import numpy as np

步骤2:申请np.log标量、列表或 NumPy 数组。

arr = np.array([1, 2, 3, 4], dtype=float)
print(np.log(arr))        # [0.         0.69314718 1.09861229 1.38629436]

步骤3:显式处理零和负数以避免无效结果。

# Configure how NumPy reports floating errors (optional).
np.seterr(divide="ignore", invalid="ignore")

data = np.array([1.0, 0.0, -2.0, 3.0])
logs = np.log(data)                 # [-0.         -inf  nan  1.09861229]

# Mask out invalids for downstream use.
valid_mask = data > 0
logs_clean = np.full_like(data, np.nan)
logs_clean[valid_mask] = np.log(data[valid_mask])
print(logs_clean)                   # [0.         nan nan 1.09861229]

第4步:需要时使用碱基变化公式计算其他碱基。

x = np.array([10, 100, 1000], dtype=float)
base = 10.0
print(np.log(x) / np.log(base))     # [1. 2. 3.]
  • NumPy 对运算进行矢量化,因此大型数组可以快速计算。
  • 对于接近零的小 x,np.log1p(x)提高 ln(1+x) 的数值精度。

方法 3 — 处理复数

步骤一:导入复数标量数学库。

import cmath

步骤2:使用cmath.log对于复数标量或np.log对于复杂的数组。

z = 3 + 2j
print(cmath.log(z))       # (1.2824746787307684+0.5880026035475675j)

z_arr = np.array([1+1j, 2+0j, -1+0j], dtype=complex)
print(np.log(z_arr))      # Complex-valued natural logs
  • 实值的math模块不支持复杂的输入;使用cmath或 NumPy 复杂数组。

就是这样——使用math.log对于简单的标量 ln 和np.log当您需要矢量化数组运算或复数时,请记住在实数工作流程中保护非正输入。