我想将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