Je veux convertir a = [1,2,3,4,5]
en a_string = "1 2 3 4 5"
. Le tableau numpy réel est assez grand (50000x200), donc je suppose que l’utilisation de for loops
est trop lente.
Vous pouvez utiliser la méthode join
de string:
>>> a = [1,2,3,4,5]
>>> ' '.join(map(str, a))
"1 2 3 4 5"
np.savetxt
Python 3 ( voir aussi ):
import numpy as np
import sys
a = np.array([0.0, 1.0, 2.0, 3.0])
np.savetxt(sys.stdout.buffer, a)
Python 2:
import numpy as np
import sys
a = np.array([0.0, 1.0, 2.0, 3.0])
np.savetxt(sys.stdout, a)
Sortie:
0.000000000000000000e+00
1.000000000000000000e+00
2.000000000000000000e+00
3.000000000000000000e+00
Contrôler la prévision
Utilisez fmt
:
np.savetxt(sys.stdout, a, fmt="%.3f")
sortie:
0.000
1.000
2.000
3.000
ou:
np.savetxt(sys.stdout, a, fmt="%i")
sortie:
0
1
2
3
Obtenir une chaîne au lieu d'imprimer
Python 3:
import io
bio = io.BytesIO()
np.savetxt(bio, a)
mystr = bio.getvalue().decode('latin1')
print(mystr, end='')
Nous utilisons latin1
parce que les documents nous indiquent qu'il s'agit du codage utilisé par défaut.
Python 2:
import StringIO
sio = StringIO.StringIO()
np.savetxt(sio, a)
mystr = sio.getvalue()
print mystr
Tout en une ligne
Ou si vous voulez vraiment tout en une ligne:
a = np.array([0.0, 1.0, 2.0, 3.0])
np.savetxt(sys.stdout, a, newline=' ')
print()
Sortie:
0.000000000000000000e+00 1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00
TODO: il y a un espace de fuite. La seule solution que je vois est de sauvegarder sur une chaîne et une bande.
Testé sur Python 2.7.15rc1 et Python 3.6.6, numpy 1.13.3
Numpy fournit deux fonctions pour cela array_str et array_repr -, ce qui devrait répondre à vos besoins. Puisque vous pouvez utiliser l'un ou l'autre, voici un exemple de chacun:
>>> from numpy import arange, reshape, array_str
>>> M = arange(10).reshape(2,5)
>>> M
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> array_str(M)
'[[0 1 2 3 4]\n [5 6 7 8 9]]'
>>> array_repr(M)
'array([[0, 1, 2, 3, 4],\n [5, 6, 7, 8, 9]])'
Ces deux fonctions sont hautement optimisées et doivent donc être préférées à une fonction que vous pourriez écrire vous-même. Quand on a affaire à des baies de cette taille, j'imagine que vous voulez toute la vitesse que vous pouvez obtenir.
Si vous avez un tableau numpy pour commencer plutôt qu'une liste (puisque vous mentionnez un "tableau numpy réel" dans votre message), vous pouvez utiliser re.sub
sur la représentation sous forme de chaîne du tableau:
print(re.sub('[\[\]]', '', np.array_str(a)))
Encore une fois, cela suppose que votre tableau a
était un tableau numpy à un moment donné. Cela a l’avantage de travailler aussi sur des matrices.
Peut-être un peu hacky, mais je viens de les couper après avoir utilisé np.array2string
afin:
import numpy as np
a = np.arange(0,10)
a_str = np.array2string(a, precision=2, separator=', ')
print(a_str[1:-1])
Résultat:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
np.array2string
a aussi beaucoup d'options, vous pouvez donc définir la largeur de votre colonne, ce qui peut être très utile avec beaucoup de données:
a = np.arange(0,15)
a_str = np.array2string(a, precision=2, separator=', ', max_line_width=15)
print(' ' + a_str[1:-1])
Donne:
0, 1, 2,
3, 4, 5,
6, 7, 8,
9, 10, 11,
12, 13, 14
Et il se divisera intelligemment au niveau des éléments du tableau. Notez l'espace ajouté au début de la chaîne pour prendre en compte l'alignement de la première ligne après la suppression du crochet initial.