Vem, da je ton teh niti, vendar so vsi od njih za zelo preproste primere, kot so 3x3 matrike in stvari te vrste, in rešitve se niti ne začnejo uporabljati za moj položaj. Zato poskušam narisati graf G v primerjavi z l1 (to ni enajstica, ampak L1). Podatki so v datoteki, ki sem jo naložil iz datoteke excel. Datoteka excel je velika 14x250, tako da je v njej 14 argumentov, vsak z 250 podatkovnimi točkami. Pri napaki v moji kodi mi je pomagal drug uporabnik (Hugh Bothwell!), zdaj pa se je pojavila še ena napaka.
Tu je torej zadevna koda:
# format for CSV file:
header = ['l1', 'l2', 'l3', 'l4', 'l5', 'EI',
'S', 'P_right', 'P1_0', 'P3_0',
'w_left', 'w_right', 'G_left', 'G_right']
def loadfile(filename, skip=None, *args):
skip = set(skip or [])
with open(filename, *args) as f:
cr = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
return np.array(row for i,row in enumerate(cr) if i not in skip)
#plot data
outputs_l1 = [loadfile('C:\\Users\\Chris\\Desktop\\Work\\Python Stuff\\BPCROOM - Shingles analysis\\ERR analysis\\l_1 analysis//BS(1) ERR analysis - l_1 - P_3 = {}.csv'.format(p)) for p in p3_arr]
col = {name:i for i,name in enumerate(header)}
fig = plt.figure()
for data,color in zip(outputs_l1, colors):
xs = data[:, col["l1" ]]
gl = data[:, col["G_left" ]] * 1000.0 # column 12
gr = data[:, col["G_right"]] * 1000.0 # column 13
plt.plot(xs, gl, color + "-", gr, color + "--")
for output, col in zip(outputs_l1, colors):
plt.plot(output[:,0], output[:,11]*1E3, col+'--')
plt.ticklabel_format(axis='both', style='plain', scilimits=(-1,1))
plt.xlabel('$l1 (m)$')
plt.ylabel('G $(J / m^2) * 10^{-3}$')
plt.xlim(xmin=.2)
plt.ylim(ymax=2, ymin=0)
plt.subplots_adjust(top=0.8, bottom=0.15, right=0.7)
Po zagonu celotnega programa prejmem sporočilo o napaki:
Traceback (most recent call last):
File "C:/Users/Chris/Desktop/Work/Python Stuff/New Stuff from Brenday 8 26 2014/CD_ssa_plot(2).py", line 115, in <module>
xs = data[:, col["l1" ]]
IndexError: too many indices for array
in preden sem naletel na to težavo, sem imel še eno, ki je vključevala vrstico nekaj pod tisto, na katero se nanaša zgornje sporočilo o napaki:
Traceback (most recent call last): File "FILE", line 119, in <module>
gl = data[:, col["G_left" ]] * 1000.0 # column 12
IndexError: index 12 is out of bounds for axis 1 with size 12
Razumem prvo napako, vendar imam težave z njenim odpravljanjem. Druga napaka me zmoti. Moj šef mi diha za ovratnik, zato bi bila vsaka pomoč zelo dobrodošla!
Mislim, da je težava navedena v sporočilu o napaki, čeprav je ni zelo lahko opaziti:
IndexError: too many indices for array
xs = data[:, col["l1" ]]
'Preveč indeksov' pomeni, da ste podali preveč vrednosti indeksov. Podali ste 2 vrednosti, saj pričakujete, da bodo podatki 2D-polje. Numpy se pritožuje, ker data
ni 2D (je 1D ali None).
To je le ugibanje - sprašujem se, ali eno od imen datotek, ki jih posredujete funkciji loadfile(), kaže na prazno datoteko ali na slabo formatirano datoteko? Če je tako, se lahko vrne polje, ki je 1D ali celo prazno (np.array(None)
ne vrže Error
, tako da tega nikoli ne boste vedeli...). Če se želite zaščititi pred tem neuspehom, lahko v funkcijo loadfile
vstavite nekaj preverjanja napak.
Zelo priporočam, da v zanko za
vstavite:
print(data)
To bo delovalo v Pythonu 2.x ali 3.x in bo morda razkrilo vir težave. Morda boste ugotovili, da je težava le v eni vrednosti vašega seznama outputs_l1
(tj. v eni datoteki).
Sporočilo, ki ste ga dobili, ne velja za privzeto Izjema v programu Python:
IndexError
se vrže le, če indeks ni v območju (tako piše tudi v dokumentaciji).
>>> l = []
>>> l[1]
IndexError: list index out of range
Če poskušamo seznamu posredovati več elementov ali kakšno drugo vrednost, dobimo napako TypeError
:
>>> l[1, 2]
TypeError: list indices must be integers, not tuple
>>> l[float('NaN')]
TypeError: list indices must be integers, not float
Vendar pa se zdi, da tukaj uporabljate matplotlib
, ki interno uporablja numpy
za ravnanje z matrikami. Če se poglobimo v codebase za numpy
, vidimo:
static NPY_INLINE npy_intp
unpack_tuple(PyTupleObject *index, PyObject **result, npy_intp result_n)
{
npy_intp n, i;
n = PyTuple_GET_SIZE(index);
if (n > result_n) {
PyErr_SetString(PyExc_IndexError,
"too many indices for array");
return -1;
}
for (i = 0; i < n; i++) {
result[i] = PyTuple_GET_ITEM(index, i);
Py_INCREF(result[i]);
}
return n;
}
kjer metoda razpakiranja vrže napako, če je velikost indeksa večja od velikosti rezultatov.
Za razliko od Pythona, ki ob nepravilnih indeksih sproži napako TypeError
, Numpy sproži napako IndexError
, ker podpira večdimenzionalne tabele.