存储稀疏的Numpy数组

问题描述

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

最有效的方式是仅存储以下格式的值

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

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

解决方法

您可以使用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.,1.,1.]])
,

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

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

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