如何在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左右,这正是我所希望的!