IndexError: πάρα πολλοί δείκτες για πίνακα

Ξέρω ότι υπάρχει ένας τόνος από αυτά τα νήματα, αλλά όλα αυτά είναι για πολύ απλές περιπτώσεις όπως πίνακες 3x3 και πράγματα αυτού του είδους και οι λύσεις δεν αρχίζουν καν να εφαρμόζονται στην περίπτωσή μου. Έτσι, προσπαθώ να κάνω τη γραφική παράσταση του G έναντι του l1 (που δεν είναι έντεκα, αλλά ένα L1). Τα δεδομένα βρίσκονται στο αρχείο που φόρτωσα από ένα αρχείο excel. Το αρχείο excel είναι 14x250, οπότε υπάρχουν 14 ορίσματα, το καθένα με 250 σημεία δεδομένων. Είχα έναν άλλο χρήστη (κραυγή προς τον Hugh Bothwell!) που με βοήθησε με ένα λάθος στον κώδικά μου, αλλά τώρα έχει εμφανιστεί ένα άλλο λάθος.

Οπότε εδώ είναι ο εν λόγω κώδικας:

# 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)

Μετά την εκτέλεση ολόκληρου του προγράμματος, λαμβάνω το μήνυμα σφάλματος:

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

και πριν αντιμετωπίσω αυτό το πρόβλημα, είχα ένα άλλο που αφορούσε τη γραμμή λίγες γραμμές πιο κάτω από αυτή στην οποία αναφέρεται το παραπάνω μήνυμα σφάλματος:

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

Καταλαβαίνω το πρώτο σφάλμα, αλλά απλά έχω προβλήματα με τον καθορισμό του. Το δεύτερο σφάλμα με μπερδεύει όμως. Το αφεντικό μου αναπνέει πραγματικά στο σβέρκο μου, οπότε οποιαδήποτε βοήθεια θα εκτιμηθεί ΜΕΓΑΛΥΤΑ!

Νομίζω ότι το πρόβλημα αναφέρεται στο μήνυμα σφάλματος, αν και δεν είναι πολύ εύκολο να εντοπιστεί:

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

'Πάρα πολλοί δείκτες' σημαίνει ότι έχετε δώσει πάρα πολλές τιμές δείκτη. Έχετε δώσει 2 τιμές καθώς περιμένετε τα δεδομένα να είναι ένας πίνακας 2D. Το Numpy διαμαρτύρεται επειδή το data δεν είναι 2D (είναι είτε 1D είτε None).

Αυτό είναι μια μικρή εικασία - αναρωτιέμαι αν ένα από τα ονόματα αρχείων που περνάτε στην loadfile() δείχνει σε ένα άδειο αρχείο, ή σε ένα κακώς μορφοποιημένο; Αν είναι έτσι, μπορεί να σας επιστραφεί ένας πίνακας που είναι είτε 1D, είτε ακόμα και άδειος (το np.array(None) δεν πετάει ένα Error, οπότε δεν θα το ξέρετε ποτέ...). Αν θέλετε να προφυλαχθείτε από αυτή την αποτυχία, μπορείτε να εισάγετε κάποιο έλεγχο σφαλμάτων στη συνάρτηση loadfile σας.

Συνιστώ ανεπιφύλακτα την εισαγωγή στο βρόχο for σας:

print(data)

Αυτό θα λειτουργήσει σε Python 2.x ή 3.x και μπορεί να αποκαλύψει την πηγή του προβλήματος. Μπορεί κάλλιστα να διαπιστώσετε ότι είναι μόνο μία τιμή της λίστας outputs_l1 (δηλαδή ένα αρχείο) που προκαλεί το πρόβλημα.

Σχόλια (0)

Το μήνυμα που λαμβάνετε δεν αφορά την προεπιλεγμένη εξαίρεση της Python:

Για μια νέα λίστα της Python, το IndexError πετιέται μόνο όταν ο δείκτης δεν είναι στο εύρος (ακόμα και τα docs το λένε).

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

Αν προσπαθήσουμε να περάσουμε πολλαπλά στοιχεία στη λίστα, ή κάποια άλλη τιμή, παίρνουμε το TypeError:

>>> l[1, 2]
TypeError: list indices must be integers, not tuple

>>> l[float('NaN')]
TypeError: list indices must be integers, not float

Ωστόσο, εδώ, φαίνεται να χρησιμοποιείτε την matplotlib που εσωτερικά χρησιμοποιεί την numpy για το χειρισμό πινάκων. Ψάχνοντας βαθύτερα στην βάση κώδικα για το numpy, βλέπουμε:

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;
}

όπου, η μέθοδος αποσυμπίεσης θα πετάξει ένα σφάλμα αν το μέγεθος του δείκτη είναι μεγαλύτερο από αυτό των αποτελεσμάτων.

Έτσι, σε αντίθεση με την Python που εγείρει ένα TypeError σε λανθασμένους δείκτες, το Numpy εγείρει το IndexError επειδή υποστηρίζει πολυδιάστατους πίνακες.

Σχόλια (0)