web-dev-qa-db-fra.com

IndexError: trop d'index pour le tableau

Je sais qu'il y a une tonne de ces fils, mais ils sont tous destinés à des cas très simples comme des matrices 3x3 et des choses de ce genre et les solutions ne commencent même pas à s'appliquer à ma situation. J'essaie donc de représenter graphiquement G par rapport à l1 (ce n'est pas un onze, mais un L1). Les données sont dans le fichier que j'ai chargé à partir d'un fichier Excel. Le fichier Excel est 14x250, il y a donc 14 arguments, chacun avec 250 points de données. Un autre utilisateur (crier à Hugh Bothwell!) M'a aidé avec une erreur dans mon code, mais maintenant une autre erreur est apparue.

Alors voici le code en question:

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

Après avoir exécuté le programme entier, je reçois le message d'erreur:

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

et avant d’avoir rencontré ce problème, j’en ai eu un autre impliquant la ligne située en dessous de celle à laquelle le message d’erreur ci-dessus fait référence:

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

Je comprends la première erreur, mais j’ai juste du mal à la corriger. La deuxième erreur est déroutante pour moi cependant. Mon patron respire vraiment dans mon cou et toute aide serait grandement appréciée!

52
Chris

Je pense que le problème est indiqué dans le message d'erreur, même s'il n'est pas très facile à détecter:

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

"Trop d'index" signifie que vous avez donné trop de valeurs d'index. Vous avez donné 2 valeurs car vous vous attendez à ce que les données soient un tableau 2D. Numpy se plaint car data n'est pas en 2D (1D ou None).

C'est un peu une supposition - je me demande si l'un des noms de fichier que vous passez à loadfile () pointe vers un fichier vide ou un fichier mal formaté? Si tel est le cas, vous pourriez obtenir un tableau retourné qui est 1D ou même vide (np.array(None) ne jette pas de Error, vous ne le saurez donc jamais ...). Si vous souhaitez vous protéger contre cet échec, vous pouvez insérer une vérification d'erreur dans votre fonction loadfile.

Je recommande fortement dans votre boucle for d'insérer:

print(data)

Cela fonctionnera dans Python 2.x ou 3.x et pourrait révéler la source du problème. Vous constaterez peut-être que seule la valeur de votre liste outputs_l1 (c'est-à-dire un fichier) est à l'origine du problème.

49
J Richard Snape

Le message que vous obtenez ne concerne pas l'exception par défaut de Python:

Pour une nouvelle liste python, IndexError est levé uniquement si l'index n'est pas dans la plage (même docs le dire).

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

Si nous essayons de passer plusieurs éléments à la liste, ou une autre valeur, nous obtenons le TypeError:

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

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

Cependant, ici, vous semblez utiliser matplotlib QUI UTILISE EN INTERNE numpy pour la gestion des tableaux. En creusant plus profondément à travers le codebase for numpy , nous voyons:

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

où, la méthode unpack émettra une erreur si la taille de l'index est supérieure à celle des résultats.

Donc, contrairement à Python qui soulève un TypeError sur des index incorrects, Numpy soulève un IndexError car il supporte les tableaux multidimensionnels.

0
mu 無