11
votes

Indexation de tableau de type MATLAB avec NUMPY

Dans MATLAB et NUMPY, les tableaux peuvent être indexés par des tableaux. Cependant, le comportement est différent. Permettez-moi d'expliquer cela par un exemple.

MATLAB: P>

In [2]: A = arange(25).reshape((5,5))

In [3]: A
Out[3]: 
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]])

In [6]: A[[0,2,4], [0,2,4]]
Out[6]: array([ 0, 12, 24])


0 commentaires

3 Réponses :


13
votes

Vous pouvez le faire: xxx

qui donnera le résultat de type matlab que vous voulez.

On vaut la peine d'être consciente que, plutôt incohérente, si vous utilisez des tranches Pour l'indexation, vous obtenez des résultats de type MATLAB sans un tel piratage: xxx

in numpy, contrairement à MATLAB, 1: 3 n'est pas une abréviation pour [1,2] ou quoi que ce soit du genre. (À quel point je me sens obligé de mentionner quelque chose que vous savez certainement déjà, à savoir que le 1: 3 [1,2] alors que Matlab's est un peu comme [1,2,3] : le point d'extrémité de droite est inclus dans Matlab et exclu dans Python.)


6 commentaires

C'est en fait assez inefficace. Il nécessite de créer un tableau temporaire en mémoire qui peut être assez important en fonction de la taille des tableaux avec lesquels vous travaillez. Il existe plusieurs moyens plus efficaces de le faire, y compris l'utilisation de la fonction IX_ Helper.


Yup, tous corrects. D'autre part, la chose construite par ix _ est également assez grosse, bien que temporaire. J'ai fait des expériences de synchronisation pour un tableau 5x5 comme dans la question initiale, avec les résultats suivants. [:] [:,] est d'environ 25% plus rapide que [ix _ ()] , mais si vous utilisez les mêmes index à chaque fois, construisez une matrice d'indexation une fois avec ix _ et la réutilisation est d'environ 10 fois plus vite - bien que vous payez alors un coût en mémoire.


np.ix_, dans la plupart des cas, utilise uniquement une quantité de mémoire triviale car elle renvoie des points de vue de ses arguments. Aussi np.ix_ est une opération de temps constante tandis que A [I1,:] [: I2] est ~ n ^ 2 dans l'utilisation de l'heure et de la mémoire. Mais si vous avez vraiment besoin de 25% de performances sur votre tableau 5x5, vous devez faire ce que vous devez faire.


Vous avez raison sur ix _ sans mémoire pour parler; Je n'avais pas pris au courant de cela. Merci. Si vous suggérez des occasions lorsque vous indexez un petit tableau avec des ensembles d'indices imprévisibles et que vous vous souciez de chaque dernière microseconde, vous êtes rare, alors bien sûr, je suis d'accord! L'approche ix _ sera généralement meilleure si vous vous souciez de la performance.


+1 Pour l'explication finale sur la manière d'obtenir une indexation correcte du type MATLAB en numpy en utilisant A [[0,2,4] ,:] [:, [0,2,4]] merci!


Voulez-vous simplement ajouter .. Vous ne pouvez pas définir des valeurs à l'aide de cette approche. Plutôt utilisateur @ user2593047 sa méthode



18
votes

Vous pouvez utiliser la fonction d'assistance numpy.ix_ code> pour obtenir le comportement MATLAB:

from numpy import ix_
A[ ix_( [0,2,4], [0,2,4] ) ]


0 commentaires

1
votes

Le moyen efficace de le faire avec NUMPY consiste à remodeler votre matrice d'index pour correspondre aux axes qu'ils indexent, c'est-à-dire xxx

Les règles de diffusion de diffusion sont votre ami (et tant mieux que MATLAB ) ...

hth


0 commentaires