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

读取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:55:34