J'ai 3 tableaux de même longueur (par exemple):
[a, b, c]
[1, 2, 3]
[i, ii, iii]
Je voudrais les combiner en une matrice:
|a, 1, i | |b, 2, ii | |c, 3, iii|
Le problème que j'ai est que lorsque j'utilise des codes tels que dstack code>,
hstack
ou concaténer
. Je les ai ajoutés ou empilés numériquement d'une manière avec laquelle je peux travailler.
4 Réponses :
Vous pouvez utiliser zip () :
qui mappe le même index de plusieurs conteneurs afin qu'ils puissent être utilisés uniquement en tant qu'entité unique.
[('a', 'b', 'c'), ('1', '2', '3'), ('i', 'ii', 'iii')]
SORTIE:
print(list(zip(*zip(a1, b1, c1))))
EDIT:
J'ai juste pensé à avancer, que diriez-vous d'aplatir la liste par la suite et d'utiliser numpy.reshape
[['a', '1', 'i'], ['b', '2', 'ii'], ['c', '3', 'iii']]
SORTIE:
#flatten the list for x in res: for y in x: flattened_list.append(y) # print(flattened_list) print([flattened_list[i:i+3] for i in range(0, len(flattened_list), 3)])
OU
pour une doublure là-bas:
[['a' '1' 'i'] ['b' '2' 'ii'] ['c' '3' 'iii']]
SORTIE:
flattened_list = [] #flatten the list for x in res: for y in x: flattened_list.append(y) #print(flattened_list) import numpy as np data = np.array(flattened_list) shape = (3, 3) print(data.reshape( shape ))
OR
Comme suggéré par @ norok2
[('a', '1', 'i'), ('b', '2', 'ii'), ('c', '3', 'iii')]
OUTPUT:
a1 = ['a', 'b', 'c'] b1 = ['1', '2', '3'] c1 = ['i', 'ii', 'iii'] print(list(zip(a1,b1,c1)))
Une approche beaucoup plus propre pour transposer votre liste de listes de type matrice consisterait à utiliser zip ()
deux fois, par exemple liste (zip (* zip (a1, b1, c1)))
@ norok2 doux, oui. Ajoutée
@ norok2 Vous faites cela intentionnellement maintenant! : p
cela vous donne une liste de tuples, ce qui peut ne pas être ce que vous voulez:
>>> from numpy import array >>> array([[1,2,3],[4,5,6],[7,8,9]]).transpose() array([[1, 4, 7], [2, 5, 8], [3, 6, 9]])
cela vous donne un tableau numpy:
>>> list(zip([1,2,3],[4,5,6],[7,8,9])) [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
En supposant que vous ayez 3 tableaux numpy:
>>> np.hstack((a.reshape(3, 1), b.reshape(3, 1), c.reshape(3, 1))) array([[4, 5, 3], [1, 8, 0], [4, 5, 2]])
alors vous pouvez les empiler verticalement (c'est-à-dire le long de la première dimension), puis transposer la matrice résultante pour obtenir l'ordre dont vous avez besoin:
>>> np.vstack((a, b, c)).T array([[4, 5, 3], [1, 8, 0], [4, 5, 2]])
Un exemple légèrement plus détaillé consiste à empiler à la place horizontalement, mais cela nécessite que vos tableaux soient transformés en 2D en utilisant reshape
:
XXX
Si vous avez différents types de données dans chaque tableau, il serait judicieux d'utiliser pandas pour ceci:
df1.values # array([['a', 1, 'i'], # ['b', 2, 'ii'], # ['c', 3, 'iii']], dtype=object)
Vous avez maintenant la structure souhaitée, avec les types de données appropriés pour chaque colonne:
print(df1) # 0 1 2 # 0 a 1 i #Â 1 b 2 ii # 2 c 3 iii print(df2) # col1 col2 col3 # 0 a 1 i # 1 b 2 ii # 2 c 3 iii print(df1.dtypes) # 0 object # 1 int64 # 2 object # dtype: object print(df2.dtypes) # col1 object #Â col2 int64 # col3 object # dtype: object
Vous avez probablement besoin de
zip
Je vous recommande également de partager votre code. À l'heure actuelle, on ne sait pas quel type de sortie vous souhaitez obtenir, et les noms que vous utilisez indiquent un mélange d'objets qui peuvent ou non vouloir. Par exemple, votre entrée semble être hétérogène (nombres, chaînes, etc.) que vous avez probablement dans les
list
s, mais plus tard, vous semblez utiliser les fonctionsnumpy
(par exempledstack
,hstack
) qui fonctionnent sur le tableau denumpy
, qui sont (généralement) homogènes, et dans une structure strictement matricielle non plus (pour leslist
s) ou est obsolète (ennumpy
).Peut-être que vous recherchez un moyen de structurer les données tabulaires, auquel cas je me pencherais sur les
pandas
.Je pense que vous dites que chaque tableau est un type de données différent? Dans ce cas, vous devriez regarder
pandas
.@Darius Modirrousta-Galian veuillez accepter la réponse qui vous a aidé à résoudre votre problème en cliquant sur la coche à côté, merci!