numpy.linalg.norm 是计算向量或矩阵范数的正确函数,需显式导入或使用全路径调用,且对多维数组必须指定 axis 参数以避免误算 Frobenius 范数。

norm函数在numpy.linalg里,不是numpy自带的
很多人搜 numpy.norm 会直接写错——它根本不在 numpy 命名空间下,而是藏在 numpy.linalg 子模块里。直接 import numpy as np; np.norm(...) 会报 AttributeError。
正确做法是:
import numpy as np from numpy.linalg import norm
或者更稳妥地写全路径:
import numpy as np np.linalg.norm(x)
- 别用
from numpy import *期望把norm拉进来——它不会自动导入子模块里的函数 - 如果同时用到
scipy.linalg.norm,注意两者行为基本一致,但scipy版本对稀疏矩阵支持更好 -
np.linalg.norm默认计算 Frobenius 范数(对矩阵)或 2-范数(对向量),不是欧氏距离的“开根号前”版本
向量长度默认就是2-范数,但得确认输入是1D
想算一个向量的“长度”,比如 [3, 4] 得到 5.0,直接传一维数组就行:
立即学习“Python免费学习笔记(深入)”;
x = np.array([3, 4]) np.linalg.norm(x) # → 5.0
但容易踩坑的是:如果你传的是列向量(shape 为 (2, 1)),结果一样;可一旦是二维数组且你没指定 axis,它会按矩阵整体算 Frobenius 范数(即所有元素平方和再开根),不是你想的“每行/每列的长度”。
- 确保输入是 1D:
x.flatten()或x.ravel()可保险处理 - 不要依赖
np.array([3, 4]).T来“转置成列向量”再算——它仍是 1D,除非显式用[:, None] - 如果原始数据是 DataFrame 列或 Series,先用
.values拿出 ndarray,否则可能触发 pandas 的隐式转换异常
axis参数控制按行/列算范数,不设就全量聚合
对二维数组,比如想得到每行的长度(即每条样本的 L2 模长),必须显式加 axis=1:
X = np.array([[3, 4],
[5, 12]])
np.linalg.norm(X, axis=1) # → array([5., 13.])同理,axis=0 是按列算(每列向量的长度)。漏掉 axis 就会返回单个标量:整个矩阵的 Frobenius 范数。
-
axis不接受字符串,只认整数或整数元组;axis=(0, 1)等价于不设 - 如果数组有 3D+,
axis必须明确指定要压缩哪些维度,否则报ValueError: Invalid axis - 性能上,带
axis的调用比全量略慢,但差别在微秒级,不用提前优化
ord参数换范数类型,但别乱用负数或非整数
ord 控制范数种类:ord=1 是曼哈顿距离,ord=2(默认)是欧氏,ord=np.inf 是最大绝对值。这些都安全。
但以下情况容易出问题:
-
ord=-1或ord=-2是“反向范数”,数学上有定义但极少实用,且对含零向量会出inf或nan -
ord=0不是 L0“范数”(它其实不算范数),而是非零元个数,但np.linalg.norm不支持ord=0,会报NotImplementedError - 浮点
ord如ord=1.5虽然能跑,但数值不稳定,尤其当元素接近零时误差放大明显
真要算 L0 稀疏度,直接用 np.count_nonzero(x);要算 L1,就老实用 ord=1。
实际用的时候,最常漏的是 import 路径和 axis 参数,尤其是从 pandas 或 sklearn 拿数据后直接喂给 norm,形状不对又没设 axis,结果就莫名其妙。










