web-dev-qa-db-fra.com

numpy array TypeError: seuls les tableaux scalaires entiers peuvent être convertis en 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 index scalaire

41
kinder chen

Réponse courte:

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

Ce que vous essayez de faire est et non une opération vectorisable . Wikipedia définit la vectorisation en tant que traitement par lots sur un seul tableau au lieu de sur des 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 s’appliquer de manière transparente aux vecteurs, matrices et tableaux de dimensions supérieures.

...

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

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 telle sorte qu'au lieu de traiter un seul élément d'un tableau N fois, elle traite (par exemple) 4 éléments du tableau simultanément N/4 fois.

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

Ce que vous recherchez réellement, c'est une simple expression qui les calcule toutes:

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

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

21
Maxim

essayez ce qui suit pour changer votre tableau en 1D

a.reshape((1, -1))
10
WIND.Knight

Cela pourrait ne pas être lié à ce problème spécifique, mais j'ai rencontré un problème similaire dans lequel j'avais utilisé l'indexation NumPy sur une liste Python et j'avais 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 transformer weights, une liste 1D Python, en tableau NumPy avant de pouvoir appliquer une 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]
6
Zhanwen Chen

Vous pouvez utiliser numpy.ravel pour renvoyer 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])
4
Andre Araujo

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

classes = list(unique_labels(y_true, y_pred))
2
ShadyMBA

ce problème se pose lorsque nous utilisons des vecteurs à la place de scalaires, par exemple dans une boucle for, la plage doit être un scalaire, au cas où vous auriez donné un vecteur à cet endroit, vous obtiendrez une erreur. Donc, pour éviter le problème, utilisez la longueur du vecteur que vous avez utilisé

0
Athil Althaf