J'ai un tableau Numpy multidimensionnel; disons que c'est

 myArray = array([[[ 0,  1,  2],
                   [ 3,  4,  5],
                   [ 6,  7,  8]],

                  [[ 9, 10, 11],
                   [12, 13, 14],
                   [15, 16, 17]],

                  [[18, 19, 20],
                   [21, 22, 23],
                   [24, 25, 26]]])

Je sais que l'exécution de myArray[1,1,1], par exemple, renverra 13. Cependant, je veux définir indx = [1,1,1] puis appeler quelque chose à l'effet myArray[indx]. Cependant, cela fait d'autres choses d'indexation multidimensionnelle.

J'ai également essayé myArray[*indx] mais cela génère naturellement une erreur de syntaxe.

Actuellement, ma solution de contournement très laide consiste à définir

def array_as_indices(array, matrix):
    st = ''
    for i in array:
        st += '%s,' % i
    st = st[:-1]

    return matrix[eval(st)]

Qui fonctionne mais est assez inélégant et probablement lent.

Existe-t-il une manière plus pythonique de faire ce que je recherche?

1
Steve 2 juin 2020 à 22:15

3 réponses

Meilleure réponse

Les indices d'un tableau numpy sont adressés par des tuples et non par des listes. Utilisez indx = (1, 1, 1).

En tant qu'extension, si vous souhaitez appeler les indices (1, 1, 1) et (2, 2, 2), vous pouvez utiliser

>>> indx = ([1, 2], [1, 2], [1, 2])
>>> x[indx]
array([13, 26])

Le raisonnement derrière le comportement avec les listes est que numpy traite les listes de manière séquentielle, donc

>>> indx = [1, 1, 1]
>>> x[indx]
array([[[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],
       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],
       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]]])

Il renvoie une liste de trois éléments, chacun égal à x [1].

1
Gianluca Micchi 2 juin 2020 à 19:29

Il s'agit d'un duplicata de Déballage de tuples / tableaux / listes comme index pour Numpy Arrays, mais vous pouvez simplement créer un tuple

import numpy as np


def main():
    my_array = np.array(
        [
            [[0, 1, 2], [3, 4, 5], [6, 7, 8]],
            [[9, 10, 11], [12, 13, 14], [15, 16, 17]],
            [[18, 19, 20], [21, 22, 23], [24, 25, 26]],
        ]
    )
    print(f"my_array[1,1,1]: {my_array[1,1,1]}")
    indx = (1, 1, 1)
    print(f"my_array[indx]: {my_array[indx]}")


if __name__ == "__main__":
    main()

Va donner

my_array[1,1,1]: 13
my_array[indx]: 13
2
Matthew Feickert 2 juin 2020 à 19:25

Vous pouvez simplement faire ceci:

idx = [1,1,1]

myArray[tuple(idx)]
1
Mayank Porwal 2 juin 2020 à 19:31