【问题标题】:Storing a Sparse Numpy Array存储稀疏 Numpy 数组
【发布时间】:2020-08-19 19:31:47
【问题描述】:

我有一个 20,000 x 20,000 的 Numpy 矩阵,我希望按文件存储,其中平均体积只有 12 个值。

什么是最有效的方式来只存储格式的值

if array[i][j] == 1:
   file.write("{} {} {{}}\n".format(i, j)

哪里 (i, j) 是数组的索引?

【问题讨论】:

  • 您正在使用的稀疏矩阵实现是否有自己的序列化代码(例如用于pickle)?这可能比学习足够多的实现来编写自己的实现更容易学习和使用。
  • 明确一点:您愿意牺牲内存来换取性能(因此将值加载到普通的 Numpy 数组中),但希望节省磁盘空间?
  • @Blckknght 现在它只是一个 numpy 数组,所以我其实不知道,soprry!
  • @KarlKnechtel 没错!我可以牺牲尽可能多的内存来获得最佳性能。生成数组只需要 1 秒,但存储它需要整整一分钟。
  • np.nonzero 给出非零元素的索引。

标签: python arrays numpy matrix sparse-matrix


【解决方案1】:

您可以使用 scipy 从密集的 numpy 数组创建稀疏矩阵,这些数组仅存储具有非零条目的值。

import scipy
import pickle

I = np.eye(10000)  #Had 10000 nonzero values along diagonal
S = scipy.sparse.csr_matrix(I)
S
<10000x10000 sparse matrix of type '<class 'numpy.float64'>'
    with 10000 stored elements in Compressed Sparse Row format>

这非常节省内存,您可以在需要时使用pickle 转储/加载此稀疏矩阵。

#Pickle dump
file = open("S.pickle",'wb') #160kb
pickle.dump(S, file)

#Pickle load
file = open("S.pickle",'rb') 
S = pickle.load(file)

要获取密集表示,您可以简单地使用 .toarray() 获取 NumPy 数组或使用 .todense() 获取矩阵类型对象。

S.toarray()
array([[1., 0., 0., ..., 0., 0., 0.],
       [0., 1., 0., ..., 0., 0., 0.],
       [0., 0., 1., ..., 0., 0., 0.],
       ...,
       [0., 0., 0., ..., 1., 0., 0.],
       [0., 0., 0., ..., 0., 1., 0.],
       [0., 0., 0., ..., 0., 0., 1.]])

【讨论】:

    【解决方案2】:

    对于那些事后阅读的人: @hpaulj 使用“np.nonzero”的评论有效地解决了问题!

    编辑: 这是我用来解决它的代码!

    array1, array2 = np.nonzero(array)
            for i in range(0, array1.size):
                file.write("{} {} {{}}\n".format(array1[i], array2[i]))
    

    【讨论】:

    • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
    • @Gad 这是作者本人根据其中一个 cmets 发布的答案。
    猜你喜欢
    • 2018-06-28
    • 2012-06-23
    • 2016-08-26
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多