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.
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)]
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
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.