web-dev-qa-db-fra.com

Python TypeError: seuls les tableaux scalaires entiers peuvent être convertis en un index scalaire

J'ai fait pour cette question un exemple plus simple de deux tableaux: Le labelArray est un tableau 1D a des étiquettes aux indices qui correspondent aux mêmes indices du nD-tableau someValuesArray. J'obtiens tous les index où l'étiquette 2 se produit et je veux récupérer les valeurs dans someValuesArray.

labelArray = [2,0,1,2]

someValuesArray= [array([[ 2.15072 ,  2.12438 ,  2.27047 , 2.64567 , 
2.22976 ,  2.18186 ]], dtype=float32), 
    array([ [ 2.29442,  2.3087 ,  2.3111 , 2.1962 ,  2.23694, 2.16988]], dtype=float32)),
    array([[2.82851 , 2.73032 , 2.78301 , 1.71722 , 1.81542 , 1.78189 ]], dtype=float32)),
    array([[ 1.19271,  1.14721,  1.27894 , 1.16637,  1.23343, 1.21666]], dtype=float32)]

Donc, si je veux l'étiquette 2, j'obtiens les indices 0 et 3, ce qui devrait me donner les valeurs des indices 0 et 3 dans le tableau correspondant someValuesArray.

Mais je reçois un TypeError @ array[indices] lorsque je veux appeler ma fonction.

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

Ma fonction:

def searchValues(array, value):
    labelArray = [2,0,1,2]
    values_of_array = np.array(labelArray)
    indices = np.where(values_of_array == value)[0]
    return array[indices]

searchValues(someValuesArray,2)
3
grajkowski

Comme mentionné dans les commentaires, someValuesArray est un liste de tableaux numpy 2d. J'ai converti cela en un np.array. L'exemple de code dans votre question tente d'indexer une liste python avec un tableau numpy, ce qui provoque le message d'erreur que vous recevez.

In [111]: a=np.array(someValuesArray) # Convert to a numpy array

In [112]: a
Out[112]:
array([[[ 2.15071988,  2.12438011,  2.2704699 ,  2.64566994,  2.22975993,      2.18185997]],
[[ 2.29442   ,  2.30870008,  2.31110001,  2.19619989,  2.23693991,  2.16987991]],
[[ 2.82851005,  2.73031998,  2.78301001,  1.71721995,  1.81542003,  1.78189003]],
[[ 1.19271004,  1.14721   ,  1.27893996,  1.16637003,  1.23343003,  1.21666002]]], dtype=float32)

In [113]: def searchValues(array, value):
              labelArray = [2,0,1,2]
              values_of_array = np.array(labelArray)
              indices = np.where(values_of_array == value)[0]
              # print statements added to see what's happening
              print("Indices: ", indices)
              print("Array selection: \n", array[indices])
              return array

          searchValues(a,2)
[Out]
Indices:  [0 3]
Array selection:
[[[ 2.15071988  2.12438011  2.2704699   2.64566994  2.22975993  2.18185997]] # a[0]
[[ 1.19271004  1.14721     1.27893996  1.16637003  1.23343003  1.21666002]]] # a[3]

Out[113]:
array(
[[[ 2.15071988,  2.12438011,  2.2704699 ,  2.64566994,  2.22975993,  2.18185997]],
 [[ 2.29442   ,  2.30870008,  2.31110001,  2.19619989,  2.23693991,  2.16987991]],
 [[ 2.82851005,  2.73031998,  2.78301001,  1.71721995,  1.81542003,  1.78189003]],
 [[ 1.19271004,  1.14721   ,  1.27893996,  1.16637003,  1.23343003,  1.21666002]]],      dtype=float32)

Les deux indices renvoyés par indices = np.where(values_of_array == value)[0] sont utilisés pour pointer vers les lignes du tableau.

Vous avez renvoyé le tableau entier de la fonction: vouliez-vous vraiment retourner array[indices]?

5
Tls Chris

Je peux reproduire votre message d'erreur avec:

Index de liste avec un tableau scalaire:

In [7]: [1,2,3,4][np.array(1)]
Out[7]: 2

Index de liste avec un tableau de formes (1); un élément mais pas un tableau scalaire:

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

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

Mais c'est correct d'indexer un tableau comme celui-ci:

In [9]: np.array([1,2,3,4])[np.array([1])]
Out[9]: array([2])
2
hpaulj