web-dev-qa-db-fra.com

IndexError: trop d'index. Numpy Array avec 1 rangée et 2 colonnes

Quand j'essaie d'obtenir juste le premier élément d'un tableau comme celui-ci 

import numpy

a = numpy.array([1,2])

a[:,0]

Je reçois cette erreur 

---------------------------------------------------------------------------
 IndexError                                Traceback (most recent call last)
<ipython-input-3-ed371621c46c> in <module>()
----> 1 a[:,0]

IndexError: too many indices

J'aimerais trouver un moyen de le faire tout en utilisant le découpage en tranches car le code complet s'ouvre et lit de nombreux fichiers différents à l'aide de numpy.loadtxt(), qui ont tous deux colonnes qui varient de 1 à quelques N. 

4
Surfcast23

Votre tableau a = numpy.array([1,2]) n'a que one dimension: sa forme est (2,). Cependant, votre tranche a[:,0] spécifie les sélections pour deux dimensions. Cela provoque NumPy pour générer l'erreur.

Pour obtenir le premier élément de a, il vous suffit d'écrire a[0] (une sélection pour une seule dimension est effectuée ici).


En regardant votre autre question , si vous voulez vous assurer que la syntaxe a[:,0] fonctionne toujours, vous pouvez vous assurer que a a toujours deux dimensions. Lorsque vous chargez un tableau avec np.loadtxt, utilisez le paramètre ndmin, par exemple:

np.loadtxt(F, skiprows=0, ndmin=2)
11
Alex Riley

Comme mentionné ci-dessus, vous avez un tableau à une dimension et vous essayez de le découper en deux dimensions. 

Une chose à ajouter, et que j'ai trouvé très utile dans le passé, est que numpy vous permet de convertir facilement un tableau 1D en un tableau 2D (sous forme de ligne ou de colonne): 

>>> a = np.array([0,1,2])
>>> a.shape
(3,)
>>> a_row = a[None,:]
>>> a_row.shape
(1,3)
>>> a_col = a[:,None]
>>> a_col.shape
(3,1)
4
rkp

J'ai également eu du mal à résoudre ce problème lors de l'analyse de nombreux fichiers d'entrée pouvant contenir de 1 à 1 000 lignes. Cependant, j'utilise numpy genfromtxt qui ne vous permet pas de définir 'ndmin', donc la solution que j'ai proposée consiste à définir manuellement la forme du tableau sur 1 pour les tableaux à 1 ligne:

>>> arr=np.genfromtxt('file',names=['a','b'],dtype='f4,f4') 
>>> if (np.size(arr) == 1): arr.shape=1

Le tableau à 1 ligne se comporte désormais comme un tableau à 1 dimension pouvant être indexé:

>>> for i in range(np.size(arr)): print arr['a'][i]
1
Dave cook