Jeg vet at det er massevis av disse trådene, men alle er for veldig enkle tilfeller som 3x3 matriser og ting av den typen, og løsningene begynner ikke engang å gjelde for min situasjon. Så jeg' s prøver å graf G versus l1 (det' s ikke en elleve, men en L1). Dataene er i filen som jeg lastet inn fra en Excel-fil. Excel-filen er 14x250, så det er 14 argumenter, hver med 250 datapunkter. Jeg fikk hjelp av en annen bruker (takk til Hugh Bothwell!) med en feil i koden min, men nå har det dukket opp en ny feil.
Så her er den aktuelle koden:
# 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)
Etter å ha kjørt hele programmet, får jeg feilmeldingen:
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
og før jeg støtte på det problemet, hadde jeg et annet som involverte linjen noen få under den som feilmeldingen ovenfor refererer til:
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
Jeg forstår den første feilen, men har bare problemer med å fikse den. Den andre feilen er imidlertid forvirrende for meg. Sjefen min puster meg virkelig i nakken, så all hjelp vil bli satt STOR pris på!
Jeg tror problemet ligger i feilmeldingen, selv om det ikke er så lett å få øye på:
IndexError: too many indices for array
xs = data[:, col["l1" ]]
'Too many indices' betyr at du har oppgitt for mange indeksverdier. Du har oppgitt 2 verdier fordi du forventer at data skal være en 2D-array. Numpy klager fordi data
ikke er 2D (det er enten 1D eller None).
Dette er litt av en gjetning - jeg lurer på om et av filnavnene du sender til loadfile() peker på en tom fil, eller en dårlig formatert fil? I så fall kan det hende du får tilbake en array som enten er 1D eller tom (np.array(None)
kaster ikke en Error
, så det vet du aldri...). Hvis du vil beskytte deg mot denne feilen, kan du legge inn en feilsjekk i loadfile
-funksjonen.
Jeg anbefaler på det sterkeste at du legger det inn i for
-løkken:
print(data)
Dette vil fungere i Python 2.x eller 3.x og kan avsløre kilden til problemet. Det kan godt hende at det bare er én verdi i outputs_l1
-listen (dvs. én fil) som skaper problemet.
Meldingen du får, gjelder ikke standardunntaket i Python:
For en ny Python-liste kastes IndexError
bare hvis indeksen ikke er i området (selv docs sier det).
>>> l = []
>>> l[1]
IndexError: list index out of range
Hvis vi prøver å sende flere elementer til listen, eller en annen verdi, får vi TypeError
:
>>> l[1, 2]
TypeError: list indices must be integers, not tuple
>>> l[float('NaN')]
TypeError: list indices must be integers, not float
Her ser det imidlertid ut til at du bruker matplotlib
som internt bruker numpy
til å håndtere matriser. Når vi graver dypere gjennom kodebasen for numpy
, ser vi:
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;
}
hvor unpack-metoden vil kaste en feil hvis størrelsen på indeksen er større enn størrelsen på resultatene.
I motsetning til Python, som gir en TypeError
ved feilaktige indekser, gir Numpy en IndexError
fordi den støtter flerdimensjonale matriser.