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