3 votes

Transformer les valeurs d'un tableau plat en vecteurs colonnes

J'ai un tableau de nombres en base 3 exprimés sous forme de chaînes de caractères :

['1', '2', '10']

Je veux que chaque nombre soit rempli de façon à ce que l'espace maximum occupé par chacun soit de trois.

['001', '002', '010']

Et ensuite le convertir en une matrice qui est la suivante :

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

C'est-à-dire, convertir chaque entrée de chaîne en un vecteur colonne. J'ai essayé la rotation, la transposition, et je ne suis pas sûr de la meilleure façon de le faire.

Merci

3voto

jpp Points 83462

Voici un moyen. Je n'ai pas séparé l'étape intermédiaire, mais c'est facile à faire.

lst = ['1', '2', '10']
result = list(zip(*(map(int, i.zfill(3)) for i in lst)))

Si vous voulez un numpy le tableau :

import numpy as np
arr = np.array(result)

# array([[0, 0, 0],
#        [0, 0, 1],
#        [1, 2, 0]])

3voto

Kasramvd Points 32864

Utilisez str.zfill pour le remplir de zéros, puis np.dstack pour convertir le format attendu :

In [106]: np.dstack([list(i.zfill(3)) for i in a])[0].astype(np.int)
Out[106]: 
array([[0, 0, 0],
       [0, 0, 1],
       [1, 2, 0]])

1voto

Paul Panzer Points 30707

Vous pouvez utiliser le numpy.char qui fournit des versions vectorisées de nombreuses opérations sur les chaînes de caractères :

>>> import numpy as np
>>> 
>>> a = np.array((1,2,10),'U2')
>>> a
array(['1', '2', '10'],
      dtype='<U2')
>>> 
>>> b = np.char.zfill(a, 3)
>>> b
array(['001', '002', '010'],
      dtype='<U3')
>>> 
>>> c = b.view('U1').reshape(3, 3).T.astype(int)
>>> c
array([[0, 0, 0],
       [0, 0, 1],
       [1, 2, 0]])

0voto

rnso Points 11304

Essayez le code suivant. Les explications sont ajoutées en commentaires :

lst = ['1', '2', '10']       # input list
outlist = []                 # empty output list
for i in lst:
    while len(i) <3:
        i = '0'+i           # add leading 0s
    outlist.append(list(i)) # string converted to list and added to output list

# convert to np.array, then to integers, transpose and convert back to list:
outlist = np.array(outlist).astype(np.int).T.tolist()    
print(outlist)

Sortie :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X