You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何创建dtype=float16的大型稀疏矩阵?已尝试方法均报错

如何创建浮点型大型稀疏矩阵?

嘿,我来帮你搞定这个问题!你遇到的内存错误其实是个典型误区——你调用了.todense()方法,这会把稀疏矩阵直接转换成密集矩阵。130000×130000的密集矩阵哪怕用float16存储,也需要约33.8GB内存,这远远超出普通机器的内存容量,自然会报错。

稀疏矩阵的核心价值就是只存储非零元素、大幅节省内存,正确做法是全程保留稀疏矩阵格式,绝对不要转换成密集矩阵。下面给你具体操作方案:

1. 初始化空的浮点型稀疏矩阵

直接创建指定形状和浮点类型的稀疏矩阵,跳过.todense()

from scipy.sparse import csc_matrix

# 可根据精度需求选择float16、float32或float64
Matrix1 = csc_matrix((130000, 130000), dtype='float32')

此时矩阵默认全为0,内存占用几乎可以忽略——因为没有存储任何非零元素。

2. 向稀疏矩阵添加非零元素

如果需要填充数据,推荐用坐标格式初始化,只存储你需要的非零值:

from scipy.sparse import csc_matrix
import numpy as np

# 准备非零元素的行索引、列索引和对应浮点值
rows = np.array([100, 2000, 50000])  # 示例行坐标
cols = np.array([300, 4000, 60000])  # 示例列坐标
values = np.array([1.23, 4.56, 7.89], dtype='float32')  # 浮点型数值

# 创建带初始数据的稀疏矩阵
Matrix1 = csc_matrix((values, (rows, cols)), shape=(130000, 130000))

这种方式下,内存仅用来存储这几个非零元素,完全不会有内存压力。

3. 稀疏矩阵操作注意事项

  • 大部分科学计算操作可直接在稀疏矩阵上进行,scipy.sparse库提供了对应工具:
    from scipy.sparse.linalg import inv
    
    # 稀疏矩阵乘法
    result = Matrix1 @ Matrix1.T
    # 稀疏矩阵求逆
    inv_matrix = inv(Matrix1.tocsc())
    
  • 如果确实需要查看局部数据,只转换你需要的小范围,别转整个矩阵:
    # 仅查看前10行前10列的密集矩阵
    small_dense = Matrix1[0:10, 0:10].todense()
    

核心记住:稀疏矩阵就是为处理超大矩阵而生的,只要不转成密集矩阵,就不会有内存问题!

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

火山引擎 最新活动