微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

存储稀疏的Numpy数组

如何解决存储稀疏的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]))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。