web-dev-qa-db-fra.com

Comment trouver l'index d'une valeur dans un tableau 2D en Python?

J'ai besoin de comprendre comment je peux trouver tous les index d'une valeur dans un tableau numpy 2d.

Par exemple, j'ai le tableau 2D suivant:

([[1 1 0 0],
  [0 0 1 1],
  [0 0 0 0]])

J'ai besoin de trouver l'index de tous les 1 et 0.

1: [(0, 0), (0, 1), (1, 2), (1, 3)]
0: [(0, 2), (0, 3), (1, 0), (1, 1), (the entire all row)]

J'ai essayé mais ça ne me donne pas tous les index:

t = [(index, row.index(1)) for index, row in enumerate(x) if 1 in row]

Fondamentalement, cela ne me donne qu'un seul de l'index dans chaque ligne [(0, 0), (1, 2)].

12
Pete

Vous pouvez utiliser np.where pour renvoyer un tuple de tableaux d'indices x et y où une condition donnée est contenue dans un tableau.

Si a est le nom de votre tableau:

>>> np.where(a == 1)
(array([0, 0, 1, 1]), array([0, 1, 2, 3]))

Si vous voulez une liste de paires (x, y), vous pouvez Zip les deux tableaux:

>>> Zip(*np.where(a == 1))
[(0, 0), (0, 1), (1, 2), (1, 3)]

Ou, encore mieux, @jme souligne que np.asarray(x).T peut être un moyen plus efficace de générer les paires.

23
Alex Riley

Le problème avec la compréhension de liste que vous avez fournie est qu'elle ne va que d'un niveau, vous avez besoin d'une compréhension de liste imbriquée:

a = [[1,0,1],[0,0,1], [1,1,0]]

>>> [(ix,iy) for ix, row in enumerate(a) for iy, i in enumerate(row) if i == 0]
[(0, 1), (1, 0), (1, 1), (2, 2)]

Cela étant dit, si vous travaillez avec un tableau numpy, il est préférable d'utiliser les fonctions intégrées comme suggéré par ajcr.

9
Mike

En utilisant numpy, argwhere peut être la meilleure solution:

import numpy as np

array = np.array([[1, 1, 0, 0],
                  [0, 0, 1, 1],
                  [0, 0, 0, 0]])

solutions = np.argwhere(array == 1)
print(solutions)

>>>
[[0 0]
 [0 1]
 [1 2]
 [1 3]]
0
Guillaume Lebreton