Je voudrais écrire une routine, qui lit les valeurs de certains éléments d'un tableau. La sélection d'élément est spécifiée sous la forme d'un tableau, où chaque ligne contient les indices d'un élément. La routine devrait fonctionner pour les tableaux avec un nombre arbitraire d'axes.Lire des éléments avec des indices donnés à partir d'un tableau avec un nombre arbitraire d'axes
Je pourrais trouver la solution ci-dessous, mais je ne l'aime pas, car la conversion en tuple (ou liste) semble en quelque sorte inutile, bien que j'en ai besoin pour empêcher l'indexation avancée. Y a-t-il un moyen plus numpythonique de faire ça?
import numpy as np
def get_elements(aa, inds):
myinds = tuple(inds.transpose())
return aa[myinds]
AA = np.arange(6)
AA.shape = (3, 2)
inds = np.array([[ 0, 0 ], [ 2, 1 ]])
data2 = get_elements(AA, inds) # contains [ AA[0,0], A[2,1] ]
BB = np.arange(12)
BB.shape = (2, 3, 2)
inds = np.array([[ 0, 0, 0], [ 1, 2, 1 ]])
data3 = get_elements(BB, inds) # contains [ BB[0,0,0], BB[1,2,1] ]
Pour ce que ça vaut, la conversion en tuple n'est pas trop inefficace ici. Il crée un tuple de vues de 'inds', donc il n'y a pas de copies faites (juste de nouveaux objets python qui font référence à la même mémoire). Il y a une autre façon de faire cela, mais c'est beaucoup plus rond (combiner 'np.take' et' np.ravel_multi_index', par exemple 'b.take (np.ravel_multi_index (inds.T, b.shape))'). –
Beaucoup de fonctions de 'numpy' font juste cela - prendre des nombres d'index ou d'axe, et générer un index de tuple à partir de cela. – hpaulj
OK, je vois, merci. En effet la fonction ravel_multi_index() serait aussi une option à laquelle je n'ai pas pensé. –