J'essaie d'obtenir un tableau contenant les indices de chaque élément dans un tableau N x M data
sous forme de coordonnées au format (N * M) x 2 tel que la première colonne du tableau contient des index de ligne et la deuxième colonne contient des index de colonne pour les données
. La longueur du tableau résultant serait N * M de sorte que chaque élément dans data
sous forme de ligne. Sinon, une liste de tuples avec des informations de coordonnées suffirait également.
In:
array([0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], ... )
Out:
0 1 2 ------------- 0 | a | b | c | 1 | e | f | g | 2 | h | i | j | -------------
Malheureusement, je n'ai pu trouver que des questions de personnes effectuant la conversion inverse. Mon but ultime est d'alimenter ce tableau dans scipy.spatial.distance.cdist () pour obtenir la distance de chaque point à partir de chaque autre point. Je travaille avec des données raster [(X, Y) -> Z], donc je ne peux pas utiliser cdist sur les valeurs de cellule comme il serait généralement utilisé . Je suis nouveau sur numpy, donc ça m'a un peu gratté la tête. J'ai examiné np.meshgrid, np.column_stack et np.unravel_index, mais je n'ai pas pu les faire fonctionner avec la sortie de np.indices.
3 Réponses :
Je pense que vous pouvez faire:
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
Sortie:
[*zip(*np.where(np.ones_like(a)))]
Merci beaucoup, cela a fonctionné comme un charme! Pouvez-vous expliquer l'intérieur *? Je ne sais pas comment cette partie fonctionne.
* some_iterable
décompresse some_iterable
. Donc zip (* (a, b))
équivaut à zip (a, b)
.
Vous pouvez utiliser la compréhension de liste
.
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2), (3, 0), (3, 1), (3, 2)]
M = 3 N = 4 [(i, j) for i in range(N) for j in range(M)]
Cela fonctionne, mais j'espère éviter la compréhension de la liste pour des raisons de vitesse (et pour mieux apprendre numpy). Merci quand même!
Vous pouvez utiliser unravel_index et la forme des données, cela fonctionne avec des entiers individuels ou un tableau d'entiers. Dans votre cas, vous pouvez tout obtenir sur une seule ligne avec:
np.array(np.unravel_index(np.arange(data.size),data.shape)).T
Ma question était d'obtenir cela comme un tableau numpy idéalement, donc je pense que c'est le plus correct. Merci!