IndexError: te veel indexen voor array

Ik weet dat er heel veel van deze threads zijn, maar ze zijn allemaal voor zeer eenvoudige gevallen zoals 3×3-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 heb geladen vanuit een Excel-bestand. Het Excel-bestand is 14×250, dus er zijn 14 argumenten, elk met 250 gegevenspunten. Ik had een andere gebruiker (schreeuw naar Hugh Bothwell!) die me hielp met een fout in mijn code, maar nu is er weer een 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 dat probleem tegenkwam, had ik er nog een 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 ik heb problemen met het oplossen ervan. De tweede fout is echter verwarrend voor mij. Mijn baas ademt echt in mijn nek, dus alle hulp zou ZEER gewaardeerd worden!


Antwoord 1, autoriteit 100%

Ik denk dat het probleem in de foutmelding wordt gegeven, hoewel het niet erg gemakkelijk te herkennen is:

IndexError: too many indices for array
xs  = data[:, col["l1"     ]]

‘Te veel indices’ betekent dat u te veel indexwaarden heeft opgegeven. U hebt 2 waarden gegeven omdat u verwacht dat de gegevens een 2D-array zijn. Numpy klaagt omdat data niet 2D is (het is 1D of Geen).

Dit is een beetje een gok – ik vraag me af of een van de bestandsnamen die u doorgeeft aan loadfile() verwijst naar een leeg bestand, of naar een slecht geformatteerd bestand? Als dat zo is, krijg je mogelijk een array terug die ofwel 1D is, of zelfs leeg (np.array(None) geeft geen Error, dus je zou het nooit weten. ..). Als u zich tegen deze fout wilt beschermen, kunt u een foutcontrole invoegen in uw functie loadfile.

Ik raad ten zeerste aan om in uw for-lus het volgende in te voegen:

print(data)

Dit werkt in Python 2.x of 3.x en kan de oorzaak van het probleem onthullen. Je zou kunnen ontdekken dat slechts één waarde van je outputs_l1-lijst (d.w.z. één bestand) het probleem veroorzaakt.


Antwoord 2, autoriteit 11%

Het bericht dat u krijgt is niet voor de standaarduitzondering van Python:

Voor een nieuwe pythonlijst, IndexError wordt alleen gegenereerd als de index niet binnen bereik is (zelfs docs zeggen dus).

>>> l = []
>>> l[1]
IndexError: list index out of range

Als we proberen meerdere items door te geven aan de lijst, 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 u echter matplotlib die intern numpy gebruikt voor het afhandelen van arrays. Over het dieper graven door de codebase voor numpy, we zien:

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 uitpakmethode zal een foutmelding geven als de grootte van de index groter is dan die van de resultaten.

Dus, in tegenstelling tot Python die een TypeError genereert bij onjuiste indexen, verhoogt Numpy de IndexError omdat het multidimensionale arrays ondersteunt.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes