3
votes

Fusionner deux tableaux numpy dans une liste de listes de tuples

Je n'ai pas été en mesure de comprendre cela. Merci pour toute aide:

Have:

>>> z = [[(1,2),(3,4)],[(5,6),(7,8)]]
>>> z
[[(1, 2), (3, 4)], [(5, 6), (7, 8)]]

Want:

>>> x = np.array([[1,2],[5,6]])
>>> x
array([[1, 2],
       [5, 6]])
>>> y = np.array([[3,4],[7,8]])
>>> y
array([[3, 4],
       [7, 8]])


1 commentaires

6 Réponses :


0
votes

Si vous voulez parcourir les lignes de chaque matrice, vous pouvez faire ceci:

[ [tuple(row1),tuple(row2)] for (row1, row2) in zip(x,y) ]

Cela vous donnera un générateur (si vous l'enveloppez dans une fonction), mais vous voulez une liste. Alors à la place, enveloppez-le dans une compréhension:

for (row1, row2) in zip(x,y):
    yield [tuple(row1), tuple(row2)]
       #  [ (1,2)     ,  (3,4)     ]


1 commentaires

vous devez spécifier que la version yield doit être à l'intérieur d'une définition de fonction



0
votes
x = list([[1,2],[5,6]])
y = list([[3,4],[7,8]])
x
[[1, 2], [5, 6]]
y
[[3, 4], [7, 8]]
z=list(zip(x,y))
z
[([1, 2], [3, 4]), ([5, 6], [7, 8])]

1 commentaires

Merci, mais cela produit une liste de tuples de listes, pas une liste de listes de tuples comme demandé.



3
votes

Essayez ceci:

[[(1, 2), (3, 4)], [(5, 6), (7, 8)]]

Résultat:

x_z = map(tuple,x)
y_z = map(tuple,y)
[list(i) for i in zip(x_z, y_z)]


1 commentaires

Merci, cela ressemble à la solution la plus simple.



0
votes

IIUC

z=np.array([x,y])
[list(map(tuple,z[:,x]))for x in range(len(x))]
Out[223]: [[(1, 2), (3, 4)], [(5, 6), (7, 8)]]


0 commentaires

0
votes

Pour ce que ça vaut, voici la solution la plus simple et la plus efficace (mais probablement la moins généralisée):

[[(1, 2), (3, 4)], [(5, 6), (7, 8)]]

Résultat:

result = [[(x[0,0], x[0,1]), (y[0,0], y[0,1])],
         [(x[1,0], x[1,1]), (y[1,0], y[1,1])]]

Certes, cela ne généralise pas, mais la question est - dans quelle direction la généralisation est-elle nécessaire? Dimension extérieure plus longue? Dimension intérieure plus longue? La question n'a appelé à aucune généralisation.

Sur la base d'une exigence explicitement énoncée, cette solution peut bien sûr être modifiée pour la généraliser autant que nécessaire . P >


0 commentaires

2
votes

C'est un problème amusant. Voici ce que j'ai trouvé:

[(array([1, 2]), array([3, 4])), (array([5, 6]), array([7, 8])]

En gros, zipper x et y vous permet:

print([list(map(tuple, i)) for i in zip(x, y)])
# [[(1, 2), (3, 4)], [(5, 6), (7, 8)]]

et donc vous convertissez chaque élément en premier dans une liste, puis un tuple


0 commentaires