Ik weet dat er een ton van deze threads is, maar ze zijn allemaal voor zeer eenvoudige gevallen zoals 3x3 matrices en dat soort dingen en de oplossingen zijn niet eens van toepassing op mijn situatie. Dus ik'probeer een grafiek te maken van G versus l1 (dat'is geen elf, maar een L1). De gegevens staan in het bestand dat ik uit een excel bestand heb geladen. Het excel bestand is 14x250 dus er zijn 14 argumenten, elk met 250 datapunten. Ik had een andere gebruiker (shout out naar Hugh Bothwell!) die me hielp met een fout in mijn code, maar nu is er een andere fout opgedoken.
Dus hier is de code in kwestie:
# 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)
Nadat ik het hele programma heb uitgevoerd, krijg ik de foutmelding:
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
en voordat ik tegen dat probleem aanliep, had ik een ander probleem met de regel een paar onder die waar de bovenstaande foutmelding naar verwijst:
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
Ik begrijp de eerste fout, maar heb gewoon problemen met het oplossen ervan. De tweede foutmelding is wel verwarrend voor mij. Mijn baas hijgt echt in mijn nek, dus alle hulp zou GROOT gewaardeerd worden!
Ik denk dat het probleem in de foutmelding zit, hoewel het niet erg gemakkelijk te vinden is:
IndexError: too many indices for array
xs = data[:, col["l1" ]]
'Too many indices' betekent dat je'te veel index waarden hebt gegeven. Je'hebt 2 waarden gegeven omdat je'verwacht dat data een 2D array is. Numpy klaagt omdat data
niet 2D is (het'is ofwel 1D of Geen).
Dit is een beetje een gok - ik vraag me af of een van de bestandsnamen die je doorgeeft aan loadfile() wijst naar een leeg bestand, of een slecht geformatteerd bestand? Als dat zo is, zou je een array terug kunnen krijgen die ofwel 1D is, of zelfs leeg (np.array(None)
gooit geen Error
, dus je zou het nooit weten...). Als je je tegen dit falen wilt beschermen, kun je een foutcontrole inbouwen in je loadfile
functie.
Ik raad je sterk aan om in je for
loop in te voegen:
print(data)
Dit werkt in Python 2.x of 3.x en zou de bron van het probleem kunnen onthullen. Het is heel goed mogelijk dat het slechts één waarde van je outputs_l1
lijst is (d.w.z. één bestand) die het probleem geeft.
De melding die je krijgt is niet voor de standaard Exception van Python:
Voor een verse python lijst wordt IndexError
alleen gegooid op index die niet in bereik is (zelfs docs zeggen dat).
>>> l = []
>>> l[1]
IndexError: list index out of range
Als we proberen meerdere items aan list door te geven, of een andere waarde, krijgen we de TypeError
:
>>> l[1, 2]
TypeError: list indices must be integers, not tuple
>>> l[float('NaN')]
TypeError: list indices must be integers, not float
Hier lijkt het er echter op dat je matplotlib
gebruikt, dat intern numpy
gebruikt voor het verwerken van arrays. Als we dieper graven in de codebase voor numpy
, zien we:
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;
}
waar, de unpack methode een fout zal gooien als het de grootte van de index groter is dan die van de resultaten.
Dus, in tegenstelling tot Python die een TypeError
geeft bij onjuiste indexen, geeft Numpy de IndexError
omdat het multidimensionale arrays ondersteunt.