J'ai une liste de tuples contenant des paires de coordonnées x, y. Je souhaite transformer la liste en une matrice, avec les coordonnées xy représentant les indices de la matrice en utilisant numpy et sans utiliser de boucle.

Pour toute coordonnée xy présente dans la liste, ayez un 1 à la position d'index correspondante et un 0 pour toute valeur non présente dans la liste.

Liste originale:

a = [(0,0),(0,2),(0,3),(0,4),
    (1,1),(1,2),(1,4),(2,2),
    (3,2),(3,4), (4,4)]
a

Résultat souhaité: tableau de dimensions (5,5)

[
 [1, 1, 0, 1, 1],
 [1, 0, 0, 0, 0],
 [1, 1, 1, 1, 0],
 [0, 1, 0, 0, 0],
 [1, 0, 0, 0, 0]
                ]

Similaire à python - numpy create Masque 2D à partir de la liste des indices + puis dessin à partir du tableau masqué - Stack Overflow mais sans utiliser scipy.

3
Nick D 15 mars 2019 à 08:45

2 réponses

Meilleure réponse

Utilisez numpy.add.at et numpy.rot90:

import numpy as np

res = np.zeros((5,5))
np.add.at(res, tuple(zip(*a)), 1)
np.rot90(res)
array([[1., 1., 0., 1., 1.],
       [1., 0., 0., 0., 0.],
       [1., 1., 1., 1., 0.],
       [0., 1., 0., 0., 0.],
       [1., 0., 0., 0., 0.]])
5
Chris 15 mars 2019 à 05:53

Cela fonctionnerait:

import numpy as np

a = [(0,0),(0,2),(0,3),(0,4),     # The list we start with
    (1,1),(1,2),(1,4),(2,2),
    (3,2),(3,4), (4,4)]

ar = np.array(a)                  # Convert list to numpy array
res = np.zeros((5,5), dtype=int)  # Create, the result array; initialize with 0
res[ar[:,0], ar[:,1]] = 1         # Use ar as a source of indices, to assign 1
print (res)

Sortie:

[[1 0 1 1 1]
 [0 1 1 0 1]
 [0 0 1 0 0]
 [0 0 1 0 1]
 [0 0 0 0 1]]
1
fountainhead 15 mars 2019 à 06:00