Как решить эту ошибку: индекс 3 выходит за пределы для оси 0 с размером 3? - PullRequest
0 голосов
/ 09 октября 2019

Я не знаю, как выразить этот вопрос словами, но все же ...

Я получаю эту ошибку при выполнении моего кода:

index 3 отсутствуетграниц для оси 0 размером 3

Как мне решить эту проблему?

Мой код действительно большой упаковщик python #, так как он является частью какой-то модели, я действительно могу 'скопируйте и вставьте весь этот код.

Мне нужно предоставить один входной файл .yaml, где часть ввода говорит:

scan_idx:
- 0
- 1
- 2

Когда я запускаю это, он работает нормально, но когдаЯ добавляю еще одно число, так как мне нужно добавить четыре скана из имеющегося у меня инструмента.

scan_idx:
- 0
- 1
- 2
- 3

Когда я его запускаю, я получаю следующую ошибку

Traceback (самая последняяпоследний вызов):
Файл "PYTHON / MMFprofiling.py", строка 1096, в
mout, высота = mmf.run_both ()
Файл "PYTHON / MMFprofiling.py", строка 917, в run_both
mmfaer = self.run_mmf ("аэрозоль", self.aerosol)
Файл "PYTHON / MMFprofiling.py", строка 972, в run_mmf
tph = np.transpose (np.stack ([self. mdict ["TPheight"], self.mdict ["давление"] [ii],

IndexError: индекс 3 выходит за пределы оси 0 с размером 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
...