1
votes

Convertir numpy inidces en (N * M) x 2 tableau de coordonnées

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.


0 commentaires

3 Réponses :


0
votes

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


2 commentaires

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



0
votes

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


1 commentaires

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!



0
votes

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


1 commentaires

Ma question était d'obtenir cela comme un tableau numpy idéalement, donc je pense que c'est le plus correct. Merci!