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)]
.
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.
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.
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]]