MATLAB ind2sub équivalent en Python
Matlab dispose de deux fonctions pour la conversion de la matrice des indices linéaire des indices et vice versa. (ind2sub et sub2ind)
J'ai trouvé l'équivalent pour la R mais est-il une méthode équivalente en Python?
Vérifiez ici: github.com/jjakeman/pyheat/blob/master/utilities/math_utils.py
Je pense que vous aurez plus de chance si vous nous dites ce que vous essayez de faire. "J'essaie de reproduire cette fonction à partir d'une autre langue" n'est pas souvent très utile. Une meilleure question serait formaté quelque chose comme <description de la fonction que vous essayez d'écrire (avec des exemples d'entrées et de sorties)> -- <code que vous avez essayé> -- <(en option) d'erreurs de votre code est à jeter) et la description à propos de ce qui n'est pas de travail> -- <déclaration que ce est la reproduction de la fonction X de langage et pour ceux qui sont familiers avec la langue Y>
Vous pourriez regarder dans numpy
Depuis qu'il a rejoint et j'ai DONC eu un certain nombre de "oh, il y a une fonction pour que les" expériences. Avant j'avais coder l'équivalent de
Moi aussi lol. Un temps, j'ai essayé de calculer le discret dérivés, lorsque Amro, ou quelqu'un juste utilisé
Je pense que vous aurez plus de chance si vous nous dites ce que vous essayez de faire. "J'essaie de reproduire cette fonction à partir d'une autre langue" n'est pas souvent très utile. Une meilleure question serait formaté quelque chose comme <description de la fonction que vous essayez d'écrire (avec des exemples d'entrées et de sorties)> -- <code que vous avez essayé> -- <(en option) d'erreurs de votre code est à jeter) et la description à propos de ce qui n'est pas de travail> -- <déclaration que ce est la reproduction de la fonction X de langage et pour ceux qui sont familiers avec la langue Y>
Vous pourriez regarder dans numpy
unravel_index
.Depuis qu'il a rejoint et j'ai DONC eu un certain nombre de "oh, il y a une fonction pour que les" expériences. Avant j'avais coder l'équivalent de
bsxfun
ou accumarray
parce que je ne savais pas du tout mieux.Moi aussi lol. Un temps, j'ai essayé de calculer le discret dérivés, lorsque Amro, ou quelqu'un juste utilisé
diff
. face à la paume.
OriginalL'auteur DataTx | 2015-03-11
Vous devez vous connecter pour publier un commentaire.
Une recherche sur Google me conduire à ce lien: https://github.com/jjakeman/pyheat/blob/master/utilities/math_utils.py
De ce que je peux dire, il n'y a pas de diriger la mise en œuvre de ces fonctions de MATLAB.S'avère juste, je ne peux pas lire la documentation correctement. Si vous souhaitez que la fonctionnalité de
sub2ind
, vous aurez besoin de laravel_multi_index
fonction. La déclaration de la fonction indique que vous avez besoin de deux entrées. La première entrée est un 2Dnumpy
tableau où chaque ligne sont les endroits pour une dimension particulière. Par exemple, si vous souhaitez appliquerind2sub
sur une matrice 2D, vous pouvez spécifier un 2Dnumpy
tableau dans lequel la première ligne se compose de tous les emplacements de lignes que vous voulez, et la deuxième ligne se compose de tous les emplacements de colonne que vous voulez. La deuxième entrée est tuple qui détermine la taille de chaque dimension, donc pour un tableau 2D, ce serait le nombre de lignes et de colonnes.Faire
ind2sub
, vous voulez leunravel_index
fonction. La première entrée est un tableau linéaire des indices que vous voulez convertir dans des endroits de chaque dimension dans votre tableau. La deuxième entrée est un n-uplet de dimensions, comme précédemment.Je vais laisser le post en bas pour la postérité, dans le cas où vous voulez essayer et de mettre en œuvre vous-même.
Cependant, vous pouvez certainement mettre en œuvre ces vous-même. Je suppose que parce que vous avez attaché votre post avec
numpy
que vous aurez envie d'unenumpy
-esque solution. Rappelez-vous, dansnumpy
vous accéder à des éléments de ligne majeur, pas colonne majeur, et donc, étant donné deux ensembles tels que l'un est pour la ligne et l'autre pour la colonne des indices (0-indexé),sub2ind
pour les matrices 2D est très simple:array_shape
est un tableau de deux éléments dont le premier élément est le nombre de lignes dans la matrice et le second élément est le nombre de colonnes. Si vous vous souvenez, vous pouvez accéder à un élément dans une rangée-major de la matrice par:(r,c)
sont la ligne et la colonne de l'index que vous voulez, à condition de la 0-indexé. De faire le chemin inverse, vous pouvez utiliser division entière et le module:Ici, la sortie est à deux éléments d'un tuple dont le premier élément est la rangée d'emplacements et le deuxième élément est la colonne endroits. Pour résumer
ind2sub
, pour accéder à la ligne que vous voulez, vous prenez le linéaire de l'indice et de faire une division entière avec les colonnes. Pour obtenir la colonne que vous souhaitez, vous trouverez le module ou le reste. Aller à 3 dimensions et au-delà est un peu plus compliqué. Je vais vous laisser jeter un oeil au lien que j'ai mentionné ci-dessus pour plus de détails.Évidemment, je ne place pas de contrôle d'erreur dans les fonctions ci-dessus, de sorte que vous feriez bien évidemment utiliser
array_shape
à votre avantage dans ce cas. Une meilleure façon de faire ce que vous voulez serait quelque chose comme:J'ai fait quelques erreur de base de vérification pour s'assurer qu'aucune des lignes ou des colonnes pour
sub2ind
ou linéaire des indices pourind2sub
sont hors limites. J'ai mis ces emplacements à -1 de sorte que vous savez que vous foiré quelque part.Bonne chance!
OriginalL'auteur rayryeng
Je pense que vous voulez ravel_multi_index et unravel_index
OriginalL'auteur TheBlackCat
Bâtiment sur @rayryeng et @theblackcat de réponses, vous devez également noter que vous devrez utiliser Fortran style d'indexation, et de rappeler que Python est 0 indexé alors que MATLAB est de 1 indexés.
Le Fortran style exigence trompé moi un peu.
En Python:
et dans MATLAB/Octave
OriginalL'auteur Gilly
Pour les matrices 2D, vous pouvez utiliser Python intégré dans
divmod
fonction (renvoie le quotient et reste de la division). Pour obtenir des indices(r,c)
d'unnrows x ncols
de la matrice, utilisation:(r, c) = divmod(ind, ncols)
pour ligne-major de la commande(c, r) = divmod(ind, nrows)
pour le classement de la colonne principalePar exemple, un 3x6 de la matrice en ligne-majeur (type C) de la commande:
Un 3x6 matrice dans la colonne principale (Fortran style) de la commande:
OriginalL'auteur Nirmal