小编use*_*929的帖子

内存高效的Python批处理

我写了一个小的python批处理器,它加载二进制数据,执行numpy操作并存储结果.它消耗的内存比它应该多得多.我查看了类似的堆栈溢出讨论,并想要求进一步的建议.

背景

我将光谱数据转换为rgb.光谱数据存储在线段交错(BIL)图像文件中.这就是我逐行读取和处理数据的原因.我使用Spectral Python Library读取数据,它返回一个numpy数组.hyp是大型光谱文件的描述符:hyp.ncols = 1600,hyp.nrows = 3430,hyp.nbands = 160

import spectral
import numpy as np
import scipy

class CIE_converter (object):
   def __init__(self, cie):
       self.cie = cie

    def interpolateBand_to_cie_range(self, hyp, hyp_line):
       interp = scipy.interpolate.interp1d(hyp.bands.centers,hyp_line, kind='cubic',bounds_error=False, fill_value=0)
       return interp(self.cie[:,0])

    #@profile
    def spectrum2xyz(self, hyp):
       out = np.zeros((hyp.ncols,hyp.nrows,3))
       spec_line = hyp.read_subregion((0,1), (0,hyp.ncols)).squeeze()
       spec_line_int = self.interpolateBand_to_cie_range(hyp, spec_line)
       for ii in xrange(hyp.nrows):
          spec_line = hyp.read_subregion((ii,ii+1), (0,hyp.ncols)).squeeze()
          spec_line_int = self.interpolateBand_to_cie_range(hyp,spec_line)
          out[:,ii,:] = np.dot(spec_line_int,self.cie[:,1:4])
       return out
Run Code Online (Sandbox Code Playgroud)

记忆消耗

所有大数据都在循环外初始化.我天真的解释是内存消耗不应该增加(我是否使用了太多的Matlab?)有人能解释一下增加因子10吗?这不是线性的,因为hyp.nrows …

python memory-management numpy memory-profiling spectral

5
推荐指数
1
解决办法
1228
查看次数

科学python中的最佳多重返回值

我使用scipy/numpy代替matlab研究代码.有一个缺陷,我经常遇到.我找到了一种解决方案,但想要检查最佳实践和更好的解决方案.想象一下一些数学优化:

def calculation (data, max_it=10000, tol = 1e-5):
    k = 0
    rmse = np.inf 
    while k < max_it and rmse > tol:
        #calc and modify data - rmse becomes smaller in each iteration
        k += 1
    return data
Run Code Online (Sandbox Code Playgroud)

它运行正常,我将它嵌入到我的代码中,在多个位置,例如:

 import module
 d = module.calculation (data)
Run Code Online (Sandbox Code Playgroud)

但有时我想检查更多的见解并需要多个返回值.如果我只是附加多个返回值,我必须修改其他代码并解压缩第一个返回值.这是少数情况之一,我更喜欢matlab scipy.在matlab中,只评估第一个返回值,除非你明确要求其余的.

所以我的matlab-like(=最佳)多个返回值的解决方案是[模块]的全局变量

def calculation (data, max_it=10000, tol = 1e-5):
    global k
    global rmse
    k = 0
    rmse = np.inf 
    while k < max_it and rmse > tol:
        #calc and modify …
Run Code Online (Sandbox Code Playgroud)

python numpy ipython scipy

4
推荐指数
1
解决办法
161
查看次数