1
votes

Combinaison de 3 tableaux en 1 matrice (Python 3)

J'ai 3 tableaux de même longueur (par exemple):

  1. [a, b, c]
  2. [1, 2, 3]
  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.


5 commentaires

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 fonctions numpy (par exemple dstack , hstack ) qui fonctionnent sur le tableau de numpy , qui sont (généralement) homogènes, et dans une structure strictement matricielle non plus (pour les list s) ou est obsolète (en numpy ).


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!


4 Réponses :


1
votes

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


3 commentaires

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



0
votes

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


0 commentaires

1
votes

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


0 commentaires

0
votes

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


0 commentaires