我有一个20,000 x 20,000的Numpy矩阵,我希望按文件存储,其中平均卷只有12个值。只存储格式为
if array[i][j] == 1: file.write("{} {} {{}}\n".format(i, j)
其中(i,j)是数组的索引?
af7jpaap1#
您可以使用scipy从密集的numpy数组中创建稀疏矩阵,这些数组仅存储索引中具有非零条目的值。
scipy
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
#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()来得到一个矩阵类型的对象。
.toarray()
.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.]])
68bkxrlz2#
对于那些阅读后的事实:@hpaulj使用np.nonzero的评论有效地解决了这个问题!编辑:这是我用来解决它的代码!
np.nonzero
array1, array2 = np.nonzero(array) for i in range(0, array1.size): file.write("{} {} {{}}\n".format(array1[i], array2[i]))
2条答案
按热度按时间af7jpaap1#
您可以使用
scipy
从密集的numpy数组中创建稀疏矩阵,这些数组仅存储索引中具有非零条目的值。这是非常高效的内存,当你需要的时候,你可以使用
pickle
来转储/加载这个稀疏矩阵。为了得到一个密集的表示,你可以简单地使用
.toarray()
来得到一个NumPy数组,或者使用.todense()
来得到一个矩阵类型的对象。68bkxrlz2#
对于那些阅读后的事实:@hpaulj使用
np.nonzero
的评论有效地解决了这个问题!编辑:这是我用来解决它的代码!