web-dev-qa-db-fra.com

TypeError: seuls les tableaux scalaires entiers peuvent être convertis en index scalaire avec un tableau 1D numpy index

Je veux écrire une fonction qui sélectionne aléatoirement des éléments d'un ensemble d'apprentissage, mais en fonction de la probabilités bin fournie. I divise les indices définis en 11 groupes, puis crée probabilités personnalisées pour eux.

bin_probs = [0.5, 0.3, 0.15, 0.04, 0.0025, 0.0025, 0.001, 0.001, 0.001, 0.001, 0.001]

X_train = list(range(2000000))

train_probs = bin_probs * int(len(X_train) / len(bin_probs)) # extend probabilities across bin elements
train_probs.extend([0.001]*(len(X_train) - len(train_probs))) # a small fix to match number of elements
train_probs = train_probs/np.sum(train_probs) # normalize
indices = np.random.choice(range(len(X_train)), replace=False, size=50000, p=train_probs)
out_images = X_train[indices.astype(int)] # this is where I get the error

Je reçois l'erreur suivante:

TypeError: only integer scalar arrays can be converted to a scalar index with 1D numpy indices array

Je trouve cela bizarre, car j’ai déjà vérifié le tableau d’indices que j’ai créé, c’est 1-D, c’est entier, et c’est scalaire.

Qu'est-ce que je rate?

Remarque: j'ai essayé de passer indices avec astype(int). Même erreur.

10
3yanlis1bos

Peut-être que le message d'erreur est quelque peu trompeur, mais l'essentiel est que X_train est une liste, pas un tableau numpy. Vous ne pouvez pas utiliser d'indexation sur ce tableau. Faites-en d'abord un tableau:

out_images = np.array(X_train)[indices.astype(int)]
33
DYZ

Un cas simple qui génère ce message d'erreur:

In [8]: [1,2,3,4,5][np.array([1])]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-55def8e1923d> in <module>()
----> 1 [1,2,3,4,5][np.array([1])]

TypeError: only integer scalar arrays can be converted to a scalar index

Quelques variations qui fonctionnent:

In [9]: [1,2,3,4,5][np.array(1)]     # this is a 0d array index
Out[9]: 2
In [10]: [1,2,3,4,5][np.array([1]).item()]    
Out[10]: 2
In [11]: np.array([1,2,3,4,5])[np.array([1])]
Out[11]: array([2])

L'indexation de base de la liste python est plus restrictive que celle de numpy:

In [12]: [1,2,3,4,5][[1]]
....
TypeError: list indices must be integers or slices, not list

modifier

En regardant à nouveau

indices = np.random.choice(range(len(X_train)), replace=False, size=50000, p=train_probs)

indices est un tableau d'entiers 1d, mais il n'est certainement pas scalaire. C'est un tableau de 50000 entiers. Les listes ne peuvent pas être indexées avec plusieurs index à la fois, qu'ils soient dans une liste ou un tableau.

2
hpaulj