2017-09-09 8 views
2

Quelle est la manière de Python d'obtenir une liste d'éléments dans une matrice passant par (x,y)?Façon pythonique d'obtenir les diagonales passant par un point (x, y)

Pour exemple, étant donné une matrice comme:

[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] 

et un point, par exemple, (1,3) (représentant l'élément 9) comment puis-je obtenir les éléments dans les diagonales passant par 9 de manière Pythonic? Fondamentalement, [3,9,15] et [5,9,13,17,21] les deux. Désolé, je suis en train d'apprendre Python, d'où la question. Je vous remercie!

+0

Pour 9, voulez-vous 3, 9, 15? –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Désolé, j'ai mis à jour la question. Je voulais dire les deux diagonales. –

+0

Conservez-vous la matrice sous forme de liste de listes? – dsaxton

Répondre

5

En utilisant np.diagonal avec une petite logique de décalage.

import numpy as np 

lst = np.array([[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]]) 


i, j = 1, 3 
major = np.diagonal(lst, offset=(j - i)) 
print(major) 
array([ 3, 9, 15]) 

minor = np.diagonal(np.rot90(lst), offset=-lst.shape[1] + (j + i) + 1) 
print(minor) 
array([ 5, 9, 13, 17, 21]) 

Les indices i et j sont la rangée et de colonne. En spécifiant le décalage, numpy sait d'où commencer la sélection des éléments pour la diagonale. Pour la grande diagonale, vous voulez commencer à collecter à partir de 3 dans la première rangée. Vous devez donc prendre l'index de colonne actuel et le soustraire par l'index de ligne en cours, pour déterminer l'index de colonne correct à la ligne 0 th. De même pour la diagonale mineure, où le tableau est retourné (rotation de 90˚) et le processus se répète.

+0

Merci. Pourriez-vous expliquer les paramètres que vous avez passés à la méthode diagonale? –

+0

@UmedhSinghBundela Expliqué au mieux de mes capacités. –

+1

Pour le second cas, je devine: 'np.diagonal (np.rot90 (lst), offset = -lst.shape [1] + (j + i) + 1)'. Considérez: 'lst = np.arange (35) .reshape (5,7) + 1' pour avoir l'idée là-bas. – Divakar