web-dev-qa-db-fra.com

Comment imprimer un tableau Numpy sans crochets?

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.

24
Framester

Vous pouvez utiliser la méthode join de string:

>>> a = [1,2,3,4,5]
>>> ' '.join(map(str, a))
"1 2 3 4 5"
37
tito

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.

3
mau5padd

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.

3
Lord Henry Wotton

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.

1
Rob