You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中正确读取Python保存的NPZ格式稀疏矩阵

R读取scipy保存的npz稀疏矩阵操作方法

通过reticulate调用numpy的load方法读取npz文件时,仅加载了压缩包内存储的独立数组,没有自动解析稀疏矩阵的结构,因此无法直接得到可用对象,按以下步骤操作即可:

  • 前置依赖准备:确保R侧已安装reticulate、Matrix包,reticulate绑定的Python环境已安装numpy、scipy库,缺Python依赖时直接在R中运行py_install("scipy")即可自动安装。
  • 推荐读取方案(适配绝大多数版本环境):直接调用scipy自带的npz稀疏矩阵读取接口,再自动转换为R原生稀疏矩阵对象,代码如下:
library(reticulate)
library(Matrix)

# 导入Python依赖模块
np <- import("numpy")
scipy_sparse <- import("scipy.sparse")

# 直接读取npz格式稀疏矩阵
py_sparse_mat <- scipy_sparse$load_npz("data.npz")

# 转换为R原生CsparseMatrix稀疏矩阵对象
r_sparse_mat <- as(py_sparse_mat, "CsparseMatrix")

# 非必要不转稠密数据框:大矩阵转稠密结构会占用数倍乃至数十倍内存
# r_df <- as.data.frame(as.matrix(r_sparse_mat))
  • 兜底兼容方案(老版本环境转换失败时使用):手动提取CSR稀疏矩阵的核心组件,在R侧手动组装,代码如下:
library(reticulate)
library(Matrix)

np <- import("numpy")
npz_content <- np$load("data.npz")

# 提取CSR矩阵核心存储组件,注意Python索引从0开始,R从1开始需要偏移
mat_data <- as.numeric(npz_content[["data"]])
mat_indices <- npz_content[["indices"]] + 1L
mat_indptr <- npz_content[["indptr"]]
mat_dim <- unlist(npz_content[["shape"]])

# 组装为R原生稀疏矩阵
r_sparse_mat <- sparseMatrix(
  i = mat_indices,
  p = mat_indptr,
  x = mat_data,
  dims = c(mat_dim[1], mat_dim[2]),
  index1 = TRUE
)

注意事项

  • 旧教程方法失效的核心原因是没有适配新版reticulate和scipy的类型转换逻辑,直接调用scipy的load_npz接口比用numpy读压缩包再解析更稳定
  • 除非后续分析必须用稠密数据框结构,否则全程保持稀疏矩阵格式操作,可大幅降低内存占用,避免程序崩溃

内容的提问来源于stack exchange,提问作者Stücke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:09:56