读取h5ad文件遇AttributeError:'ArrayView'无'A1'属性求解决方案
问题描述
导入已处理的h5ad文件时,因X被存储为numpy array而非numpy matrix,调用sn.pp.read_h5ad并开启pr_process="Yes"时触发报错——报错源于scanet的预处理代码尝试调用.A1属性(该属性仅属于scipy稀疏矩阵),但当前ArrayView对象无此属性。
相关代码:
# Read the data data_path = "/home/bbb5130/snOMICS/maria/msrna.h5ad" adata = sn.pp.read_h5ad(data_path, pr_process="Yes") adata
报错信息:
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Cell In [15], line 3 1 # Read the data 2 data_path = "/home/bbb5130/snOMICS/maria/msrna.h5ad" ----> 3 adata = sn.pp.read_h5ad(data_path, pr_process="Yes") 4 adata File ~/miniconda3/envs/snOMICS/lib/python3.9/site-packages/scanet/preprocessing.py:54, in Preprocessing.read_h5ad(cls, filename, pr_process) 51 return sc.read_h5ad(filename) 52 else: 53 # initial preprocessing as it is required later ---> 54 return cls._intial(adata) File ~/miniconda3/envs/snOMICS/lib/python3.9/site-packages/scanet/preprocessing.py:35, in Preprocessing._intial(adata) 33 adata.var['mt'] = adata.var_names.str.startswith('MT-') 34 mito_genes = adata.var_names.str.startswith('MT-') ---> 35 adata.obs['percent_mito'] = np.sum(adata[:, mito_genes].X, axis=1).A1 / np.sum(adata.X, axis=1).A1 36 sc.pp.calculate_qc_metrics(adata, qc_vars=['mt'], percent_top=None, inplace=True) 37 sc.pp.filter_cells(adata, min_genes=0) AttributeError: 'ArrayView' object has no attribute 'A1'
解决方案
针对该问题,有三种可行的修复方式:
方法1:手动转换矩阵格式后调用预处理
先用scanpy读取文件,将X转换为scipy稀疏矩阵,再传入scanet的预处理方法:
import scanpy as sc import scanet as sn import scipy.sparse data_path = "/home/bbb5130/snOMICS/maria/msrna.h5ad" # 读取文件 adata = sc.read_h5ad(data_path) # 将numpy array转换为csr稀疏矩阵 adata.X = scipy.sparse.csr_matrix(adata.X) # 手动触发scanet的初始预处理 adata = sn.pp.Preprocessing._intial(adata)
方法2:修改scanet预处理代码(临时兼容)
找到scanet/preprocessing.py第35行,将仅适用于稀疏矩阵的.A1替换为通用的numpy数组转换方法,兼容两种数据格式:
原代码:
adata.obs['percent_mito'] = np.sum(adata[:, mito_genes].X, axis=1).A1 / np.sum(adata.X, axis=1).A1
修改为:
mito_sum = np.sum(adata[:, mito_genes].X, axis=1) total_sum = np.sum(adata.X, axis=1) # 统一转成一维numpy数组 adata.obs['percent_mito'] = np.asarray(mito_sum).ravel() / np.asarray(total_sum).ravel()
方法3:跳过scanet自动预处理,手动执行QC步骤
直接读取文件后自行计算线粒体比例及QC指标,再按需执行后续分析:
import scanpy as sc data_path = "/home/bbb5130/snOMICS/maria/msrna.h5ad" adata = sc.read_h5ad(data_path) # 手动计算线粒体相关QC指标 adata.var['mt'] = adata.var_names.str.startswith('MT-') sc.pp.calculate_qc_metrics(adata, qc_vars=['mt'], percent_top=None, inplace=True) sc.pp.filter_cells(adata, min_genes=0) # 后续可继续执行scanet的其他分析流程
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

