Je sais qu'il y a une tonne de fils de discussion de ce type, mais ils concernent tous des cas très simples, comme des matrices 3x3 et des choses de ce genre, et les solutions ne s'appliquent même pas à ma situation. J’essaie donc de représenter graphiquement G en fonction de l1 (ce n’est pas un onze, mais un L1). Les données se trouvent dans le fichier que j'ai chargé à partir d'un fichier excel. Le fichier excel est de 14x250, il y a donc 14 arguments, chacun avec 250 points de données. Un autre utilisateur (un grand merci à Hugh Bothwell !) m'a aidé à résoudre une erreur dans mon code, mais une autre erreur est apparue.
Voici donc 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 de rencontrer ce problème, j'en avais un autre impliquant la ligne un peu plus bas que 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 du mal à la corriger. La deuxième erreur me laisse perplexe. Mon patron est vraiment en train de me harceler, alors toute aide serait GRANDEMENT appréciée !
Je pense que le problème est indiqué dans le message d'erreur, bien qu'il ne soit pas très facile à repérer :
IndexError: too many indices for array
xs = data[:, col["l1" ]]
'Too many indices' ; 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 parce que data
n'est pas en 2D (c'est soit 1D soit None).
C'est un peu une supposition - je me demande si l'un des noms de fichiers que vous passez à loadfile() pointe vers un fichier vide, ou un fichier mal formaté ? Si c'est le cas, vous pourriez obtenir un tableau retourné qui est soit 1D, ou même vide (np.array(None)
ne lève pas une Error
, donc vous ne le sauriez jamais...). Si vous voulez vous prémunir contre cet échec, vous pouvez insérer un contrôle d'erreur dans votre fonction loadfile
.
Je recommande fortement d'insérer dans votre boucle for
:
print(data)
Cela fonctionnera dans Python 2.x ou 3.x et pourrait révéler la source du problème. Il se pourrait bien que ce soit une seule valeur de votre liste outputs_l1
(c'est-à-dire un seul fichier) qui pose problème.
Le message que vous obtenez ne concerne pas l'exception par défaut de Python :
Pour une liste Python fraîche, [IndexError
][1] n'est lancée que si l'index n'est pas dans la plage (même [docs][1] le dit).
>>> 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
][2] pour gérer les tableaux. En creusant plus profondément dans la [base de code de numpy
][3], 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 lancera une erreur si la taille de l'index est plus grande que celle des résultats.
Ainsi, contrairement à Python qui lève une TypeError
sur des index incorrects, Numpy lève la IndexError
car il supporte les tableaux multidimensionnels.
[1] : https://docs.python.org/3.7/library/exceptions.html#IndexError [2] : https://github.com/matplotlib/matplotlib/search?q=numpy&unscoped_q=numpy [3] : https://github.com/numpy/numpy/blob/22fe5427be1f3a0b186d01a09ff46092a42a0aa1/numpy/core/src/multiarray/mapping.c#L161