np.corrcoef默认按行计算相关系数,即每行视为一个变量、每列视为一个观测样本;需注意与pandas默认按列当变量的差异,避免矩阵形状错误。

np.corrcoef 默认按行还是按列算相关系数?
np.corrcoef 默认把**每一行当作一个变量**,把**每一列当作一个观测样本**。这和 pandas 的 corr(默认按列当变量)或统计直觉相反,容易导致矩阵转置错误、结果对不上预期。
常见错误现象:np.corrcoef(X) 返回的矩阵形状是 (n_rows, n_rows),但你以为它该是 (n_cols, n_cols) —— 实际上你传进去的是“变量×样本”格式,而它期望的是“变量×样本”,只是你误把列当变量了。
- 如果你的数据 shape 是
(100, 5)(100 个样本、5 个变量),必须先转置:np.corrcoef(X.T) - 或者显式指定
rowvar=False(推荐):np.corrcoef(X, rowvar=False) -
rowvar=True(默认)→ 行是变量;rowvar=False→ 列是变量
怎么传入多个一维数组计算它们之间的相关系数?
可以传入多个 ndarray 作为独立参数,np.corrcoef 会把它们堆叠成二维数组再计算。这种写法适合快速比较几个变量间的关系,不用构造 DataFrame。
例如想看身高、体重、血压三个序列的相关性:
import numpy as np height = np.array([170, 165, 180, 175]) weight = np.array([65, 58, 75, 70]) bp = np.array([120, 115, 130, 125]) <p>R = np.corrcoef([height, weight, bp]) # 注意:用列表包起来</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill9754" title="Secure Python Code Sandbox"><img src="https://img.php.cn/upload/skill/001/246/273/6adaf20d3191a227.jpg" alt="Secure Python Code Sandbox" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill9754" title="Secure Python Code Sandbox" class="overflowclass">Secure Python Code Sandbox</a> <p class="overflowclass">安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。</p> </div> <a rel="nofollow" href="/xiazai/skill9754" title="Secure Python Code Sandbox" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><h1>得到 3×3 矩阵,R[0,1] 就是 height 和 weight 的相关系数</h1>
- 必须用
[a, b, c]这种列表包装,不能直接写np.corrcoef(a, b, c)(会报错) - 所有数组长度必须一致,否则抛
ValueError: all arrays must have same length - 内部会自动按
rowvar=True处理,即每个数组是一行变量
为什么结果里有 nan 或 inf?怎么排查?
出现 nan 通常是因为某变量标准差为 0(全相同值),导致除零;inf 较少见,但可能源于极小方差 + 浮点误差。
典型场景:某列是常数(比如实验组标签全为 1)、某特征未归一化且含大量零、或数据读取时类型错误(如把字符串当数字读成 nan)。
- 检查每列标准差:
np.std(X, axis=0),看是否有 0 值 - 用
np.isnan(X).any()和np.isinf(X).any()提前过滤脏数据 -
np.corrcoef不自动跳过 nan,要用np.ma.corrcoef或先清理(如X = X[~np.isnan(X).any(axis=1)]) - 若必须保留缺失值,建议改用
pandas.DataFrame(X).corr(method='pearson', min_periods=1)
和 pandas.corr 对比:什么情况下该换用 pandas?
当你的变量名重要、需处理缺失值、或后续要可视化/筛选强相关对时,pandas.corr 更省心。而 np.corrcoef 是纯数值计算,无索引、无标签、不处理 nan。
-
np.corrcoef快一点,适合嵌入数值计算流程(如 PCA 前的手动标准化) -
pandas.corr自动按列算、支持min_periods、返回带行列名的DataFrame,方便.loc['A','B']查值 - 两者算法一致(Pearson),数值结果应完全相同(浮点误差除外)
- 别混用:不要用
np.corrcoef(df.values)却忘了rowvar=False,这是最常复现的 bug
实际项目里,只要数据进了 DataFrame,就别回头用 np.corrcoef —— 标签丢失、调试困难、同事看不懂。裸 NumPy 适合 pipeline 中间层或性能敏感的小矩阵。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










