如何在python中以内存有效的方式将矩阵一分为二?
我有一个大型多维矩阵,其中一个索引实际上包含一个数字的实部和虚部 下面是我要优化的代码:如何在python中以内存有效的方式将矩阵一分为二?,python,memory,numpy,bigdata,Python,Memory,Numpy,Bigdata,我有一个大型多维矩阵,其中一个索引实际上包含一个数字的实部和虚部 下面是我要优化的代码: import numpy as np big_matrix = np.random.random((8,160,23,3,23,80)) # 1240M tmp1 = np.zeros((8,80,23,3,23,80)) # 620M tmp2 = np.zeros((8,80,23,3,23,80)) # 620M for ii in np.arange(80): tmp1[:,ii,:,:,
import numpy as np
big_matrix = np.random.random((8,160,23,3,23,80)) # 1240M
tmp1 = np.zeros((8,80,23,3,23,80)) # 620M
tmp2 = np.zeros((8,80,23,3,23,80)) # 620M
for ii in np.arange(80):
tmp1[:,ii,:,:,:,:] = big_matrix[:,2*ii,:,:,:,:]
tmp2[:,ii,:,:,:,:] = big_matrix[:,2*ii+1,:,:,:,:]
final_matrix = np.vectorize(complex)(tmp1,tmp2) # 1240M
a = np.sum(final_matrix)
大_矩阵的理论内存大小应为(8*160*23*3*23*80)*8/(1024**2)=1240MB。所以我预计总内存消耗为3.7GB。相反,我的内存消耗增加到11GB。我不明白为什么?我如何优化我的程序,使其以更低的内存成本实现同样的功能
谢谢,
Sam.据我所知,
numpy.vectorize
本质上是一个Python循环,因此效率非常低。您看到的高内存消耗很可能是由它引起的
拆分此数组的方式非常规则,因此只需对其进行切片即可:
tmp1 = big_matrix[:, ::2, ...]
tmp2 = big_matrix[:, 1::2, ...]
这将为原始阵列创建“视图”,因此不需要额外的内存
查看答案,构造复杂数组的简单方法是:
final_matrix = tmp1 + 1j * tmp2
或更高效的内存:
final_matrix = 1j * tmp2
final_matrix += tmp1
如果你只对总数感兴趣,你也可以将实部和虚部分别相加,最后再将它们合并起来。谢谢!经过这些修改,我的内存使用量从11G增加到了2G左右,这正是我所希望的!