如何将numpy.memmap数组传递给np.cov函数?

时间:2014-05-23 11:05:03

标签: python arrays memory numpy out-of-memory

我想将numpy.memmap数组传递给np.cov函数,因为在使用普通的numpy数组时我有MemoryError。

类似

np.cov(data_c,rowvar=0,out=fcov)

这是我的代码段:

M= data.shape[0]
N= data.shape[1]
print data.shape
#get mean
mean= np.mean(data,axis=0)
print mean.shape
# print mean

#M x N
data_c= (data-mean) 
print data_c.shape
# print data_c

#N x N 
#calculate covariance matrix
# covData=np.cov(data_c,rowvar=0)   # must be memmaped array
fcov= np.memmap('cov.npy', dtype='float32', mode='w+', shape=(N,N))
np.cov(data_c,rowvar=0,out=fcov)
print covData.shape

但问题是np.cov没有out =参数。

当我使用

fcov= np.cov(data_c,rowvar=0)

似乎里面的np.cov是在数组的内存副本中临时创建的。

我设法取代np.cov功能,但我不明白为什么我必须乘以2,因为根据this它只是(AT * A)/(n- 1)并且它也需要矩阵转置,因此它似乎不是很好的解决方案。

def cov_mat(fmat):
    #if fmat centered then 2*(A.T*A)/(n-1) covariance matrix
    M= fmat.shape[0]
    N= fmat.shape[1]
    fcov= np.memmap('cov.npy', dtype='float32', mode='w+', shape=(N,N))

    fmat_tr= np.memmap('A_tr.npy', dtype='float32', mode='w+', shape=(N,M))
    fmat_tr= fmat.T
    np.dot(fmat_tr,fmat,out=fcov)
    fcov= 2*fcov/(N-1)

    return fcov

0 个答案:

没有答案