Я не знаю, как выразить этот вопрос словами, но все же ...
Я получаю эту ошибку при выполнении моего кода:
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