使用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当您需要矢量化数组运算或复数时,请记住在实数工作流程中保护非正输入。






