存储稀疏Numpy数组

kcrjzv8t  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(111)

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

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

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

af7jpaap

af7jpaap1#

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

68bkxrlz2#

对于那些阅读后的事实:@hpaulj使用np.nonzero的评论有效地解决了这个问题!
编辑:这是我用来解决它的代码!

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

相关问题