web-dev-qa-db-fra.com

Comment puis-je empêcher TypeError: les index de liste doivent être des entiers, pas Tuple lors de la copie d'une liste python dans un tableau numpy?

J'essaie de créer 3 tableaux/listes numpy en utilisant les données d'un autre tableau appelé mean_data comme suit:

---> 39 R = np.array(mean_data[:,0])
     40 P = np.array(mean_data[:,1])
     41 Z = np.array(mean_data[:,2])

Quand j'essaye de lancer le programme, j'obtiens l'erreur:

TypeError: list indices must be integers, not Tuple

La liste mean_data ressemble à cet exemple ...

[6.0, 315.0, 4.8123788544375692e-06],
[6.5, 0.0, 2.259217450023793e-06],
[6.5, 45.0, 9.2823565008402673e-06],
[6.5, 90.0, 8.309270169336028e-06],
[6.5, 135.0, 6.4709418114245381e-05],
[6.5, 180.0, 1.7227922423558414e-05],
[6.5, 225.0, 1.2308522579848724e-05],
[6.5, 270.0, 2.6905672894824344e-05],
[6.5, 315.0, 2.2727114437176048e-05]]

Je ne sais pas comment empêcher cette erreur, j'ai essayé de créer mean_data en tant que np.array et d'utiliser np.append pour lui ajouter des valeurs, mais cela ne résout pas le problème non plus.

Voici la traceback (utilisait ipython auparavant)

Traceback (most recent call last):
  File "polarplot.py", line 36, in <module>
    R = np.array(mean_data[:,0])
TypeError: list indices must be integers, not Tuple

Et l’autre façon que j’ai essayé de créer un tableau était:

mean_data = np.array([])

for ur, ua in it.product(uradius, uangle):
    samepoints = (data[:,0]==ur) & (data[:,1]==ua)
    if samepoints.sum() > 1:  # check if there is more than one match
        np.append(mean_data[ur, ua, np.mean(data[samepoints,-1])])
    Elif samepoints.sum() == 1:
        np.append(mean_data, [ur, ua, data[samepoints,-1]])

La trace sur qui est est:

IndexError                                Traceback (most recent call last)
<ipython-input-3-5268bc25e75e> in <module>()
     31     samepoints = (data[:,0]==ur) & (data[:,1]==ua)
     32     if samepoints.sum() > 1:  # check if there is more than one match
---> 33         np.append(mean_data[ur, ua, np.mean(data[samepoints,-1])])
     34     Elif samepoints.sum() == 1:
     35         np.append(mean_data, [ur, ua, data[samepoints,-1]])

IndexError: invalid index
30
mark mcmurray

La variable mean_data est une liste imbriquée, dans Python, l’accès à une liste imbriquée ne peut pas être effectué par découpage multidimensionnel, c.-à-d.: mean_data[1,2], à la place on écrirait mean_data[1][2].

Ceci est dû au faitmean_data[2] est une liste. L’indexation suivante est effectuée de manière récursive - puisque mean_data[2] est une liste, mean_data[2][0] est le premier index de cette liste.

Aditionellement, mean_data[:][0] ne fonctionne pas car mean_data[:] résultats mean_data.

La solution consiste à remplacer le tableau ou à importer les données d'origine, comme suit:

mean_data = np.array(mean_data)

les tableaux numpy (tels que les tableaux MATLAB et contrairement aux listes imbriquées) prennent en charge le découpage multidimensionnel avec des n-uplets.

25
mbattifarano

Vous n'avez probablement pas besoin de faire des listes et de les ajouter pour faire votre tableau. Vous pouvez probablement tout faire en même temps, ce qui est plus rapide puisque vous pouvez utiliser numpy pour faire vos boucles au lieu de les faire vous-même en pur python.

Comme d'autres l'ont déjà dit, pour répondre à votre question, vous ne pouvez pas accéder à une liste imbriquée avec deux index comme vous l'avez fait. Vous pouvez si vous convertissez mean_data à un tableau avant pas après avoir essayé de le trancher:

R = np.array(mean_data)[:,0]

au lieu de

R = np.array(mean_data[:,0])

Mais, en supposant que mean_data a une forme nx3, au lieu de

R = np.array(mean_data)[:,0]
P = np.array(mean_data)[:,1]
Z = np.array(mean_data)[:,2]

Vous pouvez simplement faire

A = np.array(mean_data).mean(axis=0)

dont les moyennes sur le 0th axe et retourne un tableau de longueur -n

Mais pour revenir à mon point de départ, je vais créer des données pour tenter d’illustrer comment vous pouvez le faire sans créer de listes élément par élément:

9
askewchan
import numpy as np

mean_data = np.array([
[6.0, 315.0, 4.8123788544375692e-06],
[6.5, 0.0, 2.259217450023793e-06],
[6.5, 45.0, 9.2823565008402673e-06],
[6.5, 90.0, 8.309270169336028e-06],
[6.5, 135.0, 6.4709418114245381e-05],
[6.5, 180.0, 1.7227922423558414e-05],
[6.5, 225.0, 1.2308522579848724e-05],
[6.5, 270.0, 2.6905672894824344e-05],
[6.5, 315.0, 2.2727114437176048e-05]])

R = mean_data[:,0]
print R
print R.shape

MODIFIER

La raison pour laquelle vous avez eu un invalid index erreur est le manque de virgule entre mean_data et les valeurs que vous vouliez ajouter.

De plus, np.append renvoie une copie du tableau et ne modifie pas le tableau d'origine. De la documentation:

Retours: append: ndarray

Une copie de arr avec les valeurs ajoutées à axis. Notez que append ne se produit pas sur place: un nouveau tableau est alloué et rempli. Si axis est None, out est un tableau aplati.

Donc, vous devez attribuer le np.append résultat dans un tableau (pourrait être mean_data lui-même, je pense), et, puisque vous ne voulez pas de tableau aplati, vous devez également spécifier l'axe sur lequel vous souhaitez ajouter.

Dans cet esprit, je pense que vous pourriez essayer quelque chose comme

mean_data = np.append(mean_data, [[ur, ua, np.mean(data[samepoints,-1])]], axis=0)

Regardez le doublé [[ et ]]: Je pense qu'ils sont nécessaires car les deux tableaux doivent avoir la même forme.

4
lmsteffan

np.append nécessite le tableau en tant que premier argument et la liste que vous souhaitez ajouter en tant que second:

mean_data = np.append(mean_data, [ur, ua, np.mean(data[samepoints,-1])])
2
gcbirzan

Juste si quelqu'un a ce problème et n'a pas fait list[index, sub-index], vous pourriez avoir le problème parce qu'il vous manque une virgule entre les tableaux dans un tableau de tableaux (c'est ce qui m'est arrivé).

0
Fabio Sungurlian