问题描述
我有一个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]))