73 votes

numpy array TypeError : seuls les tableaux scalaires entiers peuvent être convertis en un index scalaire.

i=np.arange(1,4,dtype=np.int)
a=np.arange(9).reshape(3,3)

et

a
>>>array([[0, 1, 2],
          [3, 4, 5],
          [6, 7, 8]])
a[:,0:1]
>>>array([[0],
          [3],
          [6]])
a[:,0:2]
>>>array([[0, 1],
          [3, 4],
          [6, 7]])
a[:,0:3]
>>>array([[0, 1, 2],
          [3, 4, 5],
          [6, 7, 8]])

Maintenant je veux vectoriser le tableau pour les imprimer tous ensemble. J'essaie

a[:,0:i]

ou

a[:,0:i[:,None]]

Cela donne TypeError : seuls les tableaux scalaires entiers peuvent être convertis en un index scalaire.

39voto

Maxim Points 28843

Réponse courte :

[a[:,:j] for j in i]

Ce que vous essayez de faire est pas une opération vectorisable . Wikipedia définit la vectorisation comme une opération par lot sur un seul tableau, au lieu de scalaires individuels :

En informatique, les langages de programmation de tableaux (également appelés langages vectoriels ou multidimensionnels) généralisent les opérations sur les scalaires pour les appliquer de manière transparente aux vecteurs, aux matrices et aux tableaux de dimensions supérieures.

...

... une opération qui opère sur des tableaux entiers peut être appelée une vectorisé opération...

En termes d'optimisation au niveau du processeur, le définition de la vectorisation est :

La "vectorisation" (simplifiée) est le processus de réécriture d'une boucle de sorte qu'au lieu de traiter un seul élément d'un tableau N fois, elle traite (disons) 4 éléments du tableau simultanément N/4 fois.

Le problème dans votre cas, c'est que le résultat de chaque opération individuelle possède une forme différente : (3, 1) , (3, 2) et (3, 3) . Ils ne peuvent pas former la sortie d'une seule opération vectorielle, car la sortie doit être un tableau contigu. Bien sûr, il peut contenir (3, 1) , (3, 2) et (3, 3) à l'intérieur de celui-ci (en tant que vues), mais c'est ce que votre tableau original a le fait déjà.

Ce que vous cherchez vraiment, c'est une seule expression qui les calcule toutes :

[a[:,:j] for j in i]

... mais il n'est pas vectorisé dans le sens d'une optimisation des performances. Sous le capot, c'est un bon vieux for boucle qui calcule chaque élément un par un.

1 votes

Je ne peux pas vous dire à quel point je suis reconnaissant, merci. J'ai sauvé mes jours

20voto

Zhanwen Chen Points 337

Cela pourrait ne pas être lié à ce problème spécifique, mais j'ai rencontré un problème similaire où j'ai utilisé l'indexation NumPy sur une liste Python et j'ai obtenu exactement le même message d'erreur :

# incorrect
weights = list(range(1, 129)) + list(range(128, 0, -1))
mapped_image = weights[image[:, :, band]] # image.shape = [800, 600, 3]
# TypeError: only integer scalar arrays can be converted to a scalar index

Il s'avère que j'avais besoin de tourner weights une liste Python 1D, dans un tableau NumPy avant de pouvoir appliquer l'indexation NumPy multidimensionnelle. Le code ci-dessous fonctionne :

# correct
weights = np.array(list(range(1, 129)) + list(range(128, 0, -1)))
mapped_image = weights[image[:, :, band]] # image.shape = [800, 600, 3]

13voto

WIND.Knight Points 116

essayez ce qui suit pour changer votre tableau en 1D

a.reshape((1, -1))

0 votes

stackoverflow.com/questions/48513824/ J'ai une erreur similaire, comment puis-je la résoudre ?

7voto

Andre Araujo Points 577

Vous pouvez utiliser numpy.ravel pour retourner un tableau aplati à partir d'un tableau à n dimensions :

>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> a.ravel()
array([0, 1, 2, 3, 4, 5, 6, 7, 8])

6voto

ShadyMBA Points 45

J'ai eu un problème similaire et je l'ai résolu en utilisant la liste... je ne sais pas si cela va m'aider ou non.

classes = list(unique_labels(y_true, y_pred))

1 votes

Vous avez raison... malheureusement je ne suis pas tout à fait sûr de la façon dont le problème a été résolu... J'avais un exemple fonctionnel et quand j'ai comparé la sortie de l'exemple par rapport à mon code, j'ai trouvé que le code de l'exemple dans cette ligne générait une liste d'éléments... j'ai donc pensé à faire de mon code une liste aussi et cela a réglé le problème. Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X