cn5617111 2021-06-05 03:33 采纳率: 0%
浏览 34

numpy库的求逆函数inv返回的数据类型无法更改?

起因是代码中有一步涉及矩阵求逆运算,如下:

adj = sp.coo_matrix((np.ones(edges.shape[0]), (edges[:, 0], edges[:, 1])),
                            shape=(one_hot_labels.shape[0], one_hot_labels.shape[0]),
                            dtype=np.float32)

        adj = adj + adj.T.multiply(adj.T > adj) - adj.multiply(adj.T > adj)
        eigen_adj = None
        if self.compute_s:
            eigen_adj = self.c * inv((sp.eye(adj.shape[0]) - (1 - self.c) * self.adj_normalize(adj)).toarray())

报错:

MemoryError X

Unable to allocate 28.5 GiB for an array with shape (61806, 61806) and data type float64

因为我的电脑只有16G内存,就想着把精度改成float32,但发现还是不行,即使把inv()括号里的稀疏矩阵改为float32型,inv()返回的好像还是float64,请问怎么样才能返回float32呢?

后来我又尝试了把numpy库的代码改了

但是还是不行,依旧报错:

请问有人知道这是怎么回事嘛?

  • 写回答

1条回答 默认 最新

  • 宇文叹了口气 2023-01-30 00:24
    关注

    这段代码中出现了内存问题,具体原因是在求逆运算中需要创建一个大尺寸的数组来存储矩阵,但是系统无法为这个数组分配足够的内存空间。其中shape=(61806, 61806),数据类型为float64的数组需要的空间大约是28.5 GiB。

    建议您可以尝试使用稀疏矩阵来解决这个问题。例如,使用scipy库中的sparse.linalg.inv来替代numpy库中的inv。这样可以减少内存消耗,并减少计算时间。

    同时,还可以尝试使用分块矩阵和分块矩阵求逆的方法来解决问题,这样可以将大矩阵分解成小的块来计算,也可以减少内存消耗。

    还有可以考虑使用有限元方法来求解问题,有限元方法可以将问题转化为较小的线性方程组来解决。

    综上,可以尝试使用稀疏矩阵,分块矩阵和有限元方法来解决问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 onlyoffice编辑完后立即下载,下载的不是最新编辑的文档
  • ¥15 求caverdock使用教程
  • ¥15 Coze智能助手搭建过程中的问题请教
  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。