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

转换大QuTiP对象为Numpy数组时遇MemoryError的解决咨询

问题分析与解决方案

你的核心问题是:20量子比特对应的测量算子(每个为(1048576,1048576)的矩阵)转稠密Numpy数组时,单个矩阵就需要16 TiB内存(complex128类型每个元素占16字节),27个矩阵总内存需求达432 TiB,远超普通硬件的内存上限,因此拆分后合并的思路完全不可行——无论怎么拆分,最终合并仍需占用同等量级内存。

以下是实际可行的解决方法:

1. 直接使用QuTiP Qobj完成后续计算

QuTiP的Qobj默认采用稀疏存储,仅保留非零元素,内存占用极低(20量子比特的Pauli张量积仅需约16MB/个)。如果你的后续计算(如求期望、矩阵乘法、态演化等)可以通过QuTiP原生API完成,完全不需要转换为Numpy数组:

# 示例:计算算子与密度矩阵的期望
rho = coherent_dm(2**20, 0)  # 示例密度矩阵
exp_vals = [expect(op, rho) for op in m_ops]

2. 提取稀疏矩阵表示(替代全量稠密转换)

如果必须与Numpy/Scipy生态配合,可提取QuTiP对象的稀疏矩阵(scipy.sparse格式),仅存储非零元素:

from scipy.sparse import csr_matrix

# 获取所有测量算子的稀疏矩阵表示
ops_sparse = [op.data for op in m_ops]

# 稀疏矩阵支持绝大多数Scipy线性代数运算
# 示例:稀疏矩阵与稠密向量相乘
vec = np.random.rand(2**20)
result = ops_sparse[0].dot(vec)

这种方式下,27个算子仅需约432MB内存,完全可控。

3. 转换为TensorFlow稀疏张量(适配深度学习场景)

如果后续要在TensorFlow中处理,可将Scipy稀疏矩阵转为TF稀疏张量,保持低内存占用的同时支持TF运算:

import tensorflow as tf

def csr_to_tf_sparse(csr_mat):
    indices = np.column_stack((csr_mat.row, csr_mat.col))
    values = csr_mat.data.astype(np.complex128)
    dense_shape = csr_mat.shape
    return tf.sparse.SparseTensor(indices=indices, values=values, dense_shape=dense_shape)

# 转换所有算子为TF稀疏张量
ops_tf_sparse = [csr_to_tf_sparse(op.data) for op in m_ops]

# 示例:TF稀疏张量与稠密张量相乘
tf_vec = tf.random.normal(shape=(2**20,), dtype=tf.complex128)
tf_result = tf.sparse.sparse_dense_matmul(ops_tf_sparse[0], tf_vec[:, None])

4. 分块提取局部稠密矩阵(仅需处理局部区域时)

如果确实需要处理稠密矩阵的局部块,可按需提取指定区域,而非转换整个矩阵:

def get_qobj_block(qobj, start_row, end_row, start_col, end_col):
    # 仅提取指定行列范围的稠密块
    return qobj.full()[start_row:end_row, start_col:end_col]

# 示例:提取前1000行×前1000列的块
small_block = get_qobj_block(m_ops[0], 0, 1000, 0, 1000)

内容的提问来源于stack exchange,提问作者Silvio sjsj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:15:39