如何在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
相关产品推荐
相关产品推荐

