如何解决此错误:索引3超出大小为3的轴0的界限?

2024-05-29 06:50:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道如何用语言来表达这个问题,但是。。。你知道吗

运行代码时出现以下错误:

index 3 is out of bounds for axis 0 with size 3

我该怎么解决这个问题?你知道吗

我的代码是非常大的python包装器,因为它是某些模型的一部分,我真的不能复制和粘贴所有这些代码。你知道吗

我需要提供一个.yaml输入文件,其中输入部分显示

scan_idx:
- 0
- 1
- 2

当我运行这个时,它工作得很好,但是当我再加一个数字时,因为我需要从我的仪器中加四次扫描。你知道吗

scan_idx:
- 0
- 1
- 2
- 3

当我运行它时,我得到以下错误

Traceback (most recent call last):
File "PYTHON/MMFprofiling.py", line 1096, in
mout, heights = mmf.run_both()
File "PYTHON/MMFprofiling.py", line 917, in run_both
mmfaer = self.run_mmf("aerosol", self.aerosol)
File "PYTHON/MMFprofiling.py", line 972, in run_mmf
tph = np.transpose(np.stack([self.mdict["TPheight"], self.mdict["pressure"][ii],

IndexError: index 3 is out of bounds for axis 0 with size 3

我真的不知道我应该在这里显示代码的哪一部分,因为我对Python非常陌生,但似乎我对这行代码有问题

tph = np.transpose(np.stack([self.mdict["TPheight"], self.mdict["pressure"][ii], self.mdict["temperature"][ii]]))

它应该只是工作良好,没有显示错误!你知道吗

代码:

class MMF_alone(object):
def __init__(self, mdict):
    self.aerosol = mdict["aerosol"]
    self.tracegas = mdict["tracegas"]
    self.mdict = mdict


def run_both(self):
    mmfaer = self.run_mmf("aerosol", self.aerosol)
    mmftg = self.run_mmf("tracegas", self.tracegas, mmfaer)
    mmfresults, heights = self.output(mmfaer, mmftg)
    return mmfresults, heights

def run_mmf(self, what, mgas, aer=None):
    if "tracegas" in what:
        is_tracegas = True
    elif "aerosol" in what:
        is_tracegas = False
    if self.mdict["multiprocs"]:
        task_queue = multiprocessing.Manager().Queue()
        done_queue = multiprocessing.Manager().Queue()
    else:
        results = []
    mmf = []
    reslist = []
    for ii, scan in enumerate(self.mdict["scan_idx"]):
        gasdict = {"dscd": mgas["dscd"][ii],
                   "dscd_err": mgas["dscd_err"][ii],
                   "wavelength": mgas["wavelength"],
                   "name": mgas["name"],
                   "sys_error_frac": self.mdict[
                       "systematic_errors"][mgas["name"]]}
        if is_tracegas:
            if scan == aer["scan_number"][ii]:
                print("scan", ii, " is ok", flush=True)
            else:
                raise ValueError("scan index inconsitence, tg: " +
                                 str(scan) + " aerosol: " + str(
                                    aer["scan_number"][ii]))
            ae_prof = aer["profile"][ii]
            ae_tau = aer["aod"][ii]
            if self.mdict["angstrom_exponent"][ii] != 0:
                ae_tau = (
                    (float(mgas["wavelength"]) / float(
                        self.aerosol["wavelength"])
                     )**(-self.mdict["angstrom_exponent"][ii])*ae_tau)
        else:
            ae_prof = None
            ae_tau = self.mdict["aod_apriori"]
        if (self.mdict["aeasym"]).ndim == 1:
            asy = self.mdict["aeasym"][ii]
        else:
            asy = np.interp(gasdict["wavelength"], self.mdict["aewav"],
                            self.mdict["aeasym"][ii])
        #if "default" in self.mdict["aessa_source"]:
        if (self.mdict["aessa"]).ndim == 1:
            ssa = self.mdict["aessa"][ii]
        else:
            ssa = np.interp(gasdict["wavelength"], self.mdict["aewav"],
                            self.mdict["aessa"][ii])
        tph = np.transpose(
            np.stack([self.mdict["TPheight"], self.mdict["pressure"][ii],
                      self.mdict["temperature"][ii]]))
        mmf.append(MMF(
            self.mdict["MMFtempdir"], tph.astype(str),
            str(self.mdict["z_detector"]), scan,
            self.mdict["mmfinputs_specific"], gasdict,
            self.mdict["RAA"][ii], self.mdict["SZA"][ii],
            self.mdict["el_ang"][ii], ae_prof, ae_tau, mgas["name"],
            self.mdict["mmfinputs"], self.mdict["mmfexe_tg"],
            self.mdict["mmfexe_ae"], asy, ssa,
            self.mdict["surface_albedo"], self.mdict["dimang"]))
        if self.mdict["multiprocs"]:
            if is_tracegas:
                task_queue.put((mmf[ii].run_tg, scan))
            else:
                task_queue.put((mmf[ii].run_ae, scan))
        else:
            if is_tracegas:
                reslist.append(mmf[ii].run_tg())
            else:
                reslist.append(mmf[ii].run_ae())
    if self.mdict["multiprocs"]:
        for ii in range(self.mdict["procs"]):
            task_queue.put("STOP")
        proclist = []
        for ii in range(self.mdict["procs"]):
            proclist.append(Process(target=processwrapper,
                                    args=(task_queue, done_queue)))
            print("started process", ii, flush=True)
            proclist[-1].start()
        for proc in proclist:
            proc.join()
            print("joined", proc)
        for ii in range(done_queue.qsize()):
            mres = done_queue.get()
            reslist.append(mres)
    mmf_result = MMFresults()
    local_erc = mmf_result.join(reslist)
    return mmf_result

def output(self, mmf_aerosols, mmf_tracegases):
    '''
    Collect data into a single results dictionary with correct keys

    Parameters:
    -----------
    mmf_aerosols: dictionary
        dictionary holding aerosol results
    mmf_tracegases: dictionary
        dictionary holding tracegas results

    Returns:
    -------
    mmfout: dictionary
        results dictionary
    '''
    MMFdict = yaml.load(open(self.mdict["template"]))
    mmfout = {}
    # for aer in mmf_aerosols.keys():
    orig_layerthickness = mmf_aerosols.pop("layerthickness")
    mmf_aerosols.pop("scan_number")
    version = mmf_aerosols.pop("version")
    mmfheights = mmf_aerosols.pop("middleheights")
    key="O4"
    for key in mmf_aerosols.keys():
        mentry = copy.deepcopy(MMFdict[key+"_aer"])
        mkey = mentry["name"].replace("aer/", "O4/")
        mdata = mmf_aerosols[key]
        mentry["value"] = mdata
        mentry["_FillValue"] = FillVals[mentry["_FillValue"]]
        mentry["name"] = mentry["name"].replace("aer/","")
        mmfout[mkey] = mentry
    mfout = {}
    mfout["O4"] = mmfout
    mmfout = {}
    mmf_tracegases.pop("scan_number")
    for key in mmf_tracegases:
        mentry = copy.deepcopy(MMFdict[key+"_tg"])
        # consult the tg key and find the correct name and stuff
        mkey = mentry["name"].replace(
            "tg/", self.tracegas["name"].upper() + "/")
        mdata = mmf_tracegases[key]
        mentry["value"] = mdata
        mentry["name"] = mentry["name"].replace("tg/","")
        mentry["_FillValue"] = FillVals[mentry["_FillValue"]]
        mmfout[mkey] = mentry
    mfout["TG"] = mmfout
    mfout["attributes"]= {}
    mfout["attributes"]["version"] = version
    return mfout, mmfheights

Tags: runnameinselfforscanifii

热门问题