web-dev-qa-db-fra.com

Qu'est-ce qu'une explication intuitive de np.unravel_index?

À peu près ce que le titre dit. J'ai lu la documentation et je joue à la fonction depuis un moment, mais je ne peux pas discerner quelle est la manifestation physique de cette transformation. 

13
austinkjensen

La mémoire de l'ordinateur est adressée linéairement. Chaque cellule de mémoire correspond à un numéro. Un bloc de mémoire peut être adressé sous la forme d'une base, qui est l'adresse de la mémoire de son premier élément, et de l'index de l'élément. Par exemple, supposons que l'adresse de base soit 10 000:

item index      0       1       2       3
memory address  10,000  10,001  10,002  10,003

Pour stocker des blocs multidimensionnels, leur géométrie doit en quelque sorte être adaptée à la mémoire linéaire. Dans C et NumPy, cela se fait ligne par ligne. Un exemple 2D serait:

  | 0      1      2      3
--+------------------------
0 | 0      1      2      3
1 | 4      5      6      7
2 | 8      9     10     11

Ainsi, par exemple, dans ce bloc 3-sur-4, l'index 2D (1, 2) correspondrait à l'index linéaire 6 qui est 1 x 4 + 2.

unravel_index fait l'inverse. Étant donné un index linéaire, il calcule l'index ND correspondant. Comme cela dépend des dimensions du bloc, celles-ci doivent également être transmises. Ainsi, dans notre exemple, nous pouvons récupérer l'index 2D d'origine (1, 2) à partir de l'index linéaire 6:

>>> np.unravel_index(6, (3, 4))
(1, 2)

Remarque: La description ci-dessus dissimule quelques détails. 1) La traduction de l’index d’article en adresse mémoire doit également prendre en compte la taille de l’article. Par exemple, un entier a généralement 4 ou 8 octets. Ainsi, dans ce dernier cas, l’adresse mémoire de l’élément i serait base + 8 x i. 2) NumPy est un peu plus flexible que suggéré. Il peut organiser des données ND colonne par colonne si vous le souhaitez. Il peut même gérer des données qui ne sont pas contiguës en mémoire mais qui, par exemple, laissent des espaces, etc.

18
Paul Panzer

Nous allons commencer par un exemple dans la documentation. 

>>> np.unravel_index([22, 41, 37], (7,6))
(array([3, 6, 6]), array([4, 5, 1]))

Tout d'abord, (7,6) spécifie la dimension du tableau cible dans lequel nous voulons transformer les index. Deuxièmement, [22, 41, 37] sont des indices sur ce tableau si le tableau est aplati. Si un tableau 7 par 6 est aplati, ses index ressembleront à

[ 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, 27, 28, 29, 30, 31, 32, 33,
   34, 35, 36, *37*, 38, 39, 40, *41*]

Si nous dégonflons ces index à leur position d'origine dans un tableau dim (7, 6), il serait 

      [[ 0,   1,   2,   3,   4,   5],
       [ 6,   7,   8,   9,  10,  11],
       [12,  13,  14,  15,  16,  17],
       [18,  19,  20,  21, *22*, 23],  <- (3, 4)
       [24,  25,  26,  27,  28,  29],
       [30,  31,  32,  33,  34,  35],
       [36, *37*, 38,  39,  40, *41*]]
           (6, 1)               (6,5)

Les valeurs de retour de la fonction unravel_index vous indiquent quels auraient dû être les indices de [22, 41, 37] si le tableau n'est pas aplati. Ces index auraient dû être [(3, 4), (6, 5), (6,1)] si le tableau n'est pas aplati. En d'autres termes, la fonction transfère les index d'un tableau aplatit vers sa version non aplatie.

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.unravel_index.html

15
Tai

Ce n'est pas différent dans le contenu des deux autres réponses, mais c'est peut-être plus intuitif. Si vous avez une matrice ou un tableau 2D, vous pouvez le référencer de différentes manières. Vous pouvez taper (rangée, col) pour obtenir la valeur située à (rangée, col) ou attribuer à chaque cellule un index à un seul chiffre. unravel_index ne fait que traduire entre ces deux façons de référencer des valeurs dans une matrice.

 enter image description here

Cela est extensible aux dimensions supérieures à 2. Vous devez également connaître la fonction np.ravel_index (), qui effectue la transformation inverse. Notez qu'il nécessite l'index et la forme du tableau.

Je vois aussi que j'ai deux 10 dans la matrice d'index - oups. 

7
Jon