En python, quand je dis np.array ([1,2,3]) , le résultat est

array([1, 2, 3])

Mais quand je dis np.array ([11,22,3]) le résultat est

array([11, 22,  3]) 

Qui a deux espaces avant '3' contrairement à '22' qui a un espace avant. Plus tard, j'utilise la fonction de carte pour lire ce résultat à partir d'un fichier CSV avec Pandas

appended_data.append({'array': numpyarray})
OutputDataFrame = pd.DataFrame(appended_data).ix[:, columns]
OutputDataFrame.to_csv('name.csv', index=False)

Et j'ai besoin que l'espacement soit cohérent. y a-t-il un moyen de le faire?

-1
alireza 15 janv. 2017 à 05:02

2 réponses

Meilleure réponse

Vous pouvez d'abord convertir le tableau numpy espacé régulièrement en une liste:

np.array([11, 22,  3]).tolist()

Te donnera

[11, 22, 3]

De plus, lorsque vous mappez le tableau numpy, chaque valeur individuelle transmise à la fonction n'aura pas d'espacement, vous n'avez donc pas à vous en soucier.

Voir la réponse de hpaulj ci-dessous car elle est beaucoup plus complète que le mien.

1
nbro 18 avril 2019 à 21:45

L'affichage par défaut des tableaux est une largeur de champ uniforme par élément, et non un espacement uniforme:

In [30]: x=np.array([11,223,3])

In [31]: x
Out[31]: array([ 11, 223,   3])

In [32]: x.tolist()      # list display with uniform spacing
Out[32]: [11, 223, 3]

En effet, numpy utilise un format comme:

In [35]: fmt = '  '.join(['%3d','%3d','%3d'])

In [36]: fmt
Out[36]: '%3d  %3d  %3d'

In [37]: fmt%tuple(x)
Out[37]: ' 11  223    3'

np.savetxt fait exactement cela, en utilisant les fmt et delimiter que vous fournissez.

csv signifie "séparé par des virgules". Des onglets sont également utilisés. Si un «espace blanc» est utilisé, les bons lecteurs sont tout aussi satisfaits d'un, deux ou plusieurs «blancs». Ces tableaux sont généralement formatés pour garder les colonnes alignées, pas pour garder constant l'espace entre les nombres.

Un tableau à 3 lignes avec des tailles de nombre mixtes:

In [39]: x=np.array([[1,123,32],[34,1,2],[0,23,1000]])

In [40]: x
Out[40]: 
array([[   1,  123,   32],
       [  34,    1,    2],
       [   0,   23, 1000]])

Formatage csv à largeur fixe:

In [41]: np.savetxt('test.csv',x,fmt='%5d', delimiter=',')

In [42]: cat test.csv
    1,  123,   32
   34,    1,    2
    0,   23, 1000

Lecture délimitée:

In [43]: np.genfromtxt('test.csv',delimiter=',',dtype=None)
Out[43]: 
array([[   1,  123,   32],
       [  34,    1,    2],
       [   0,   23, 1000]])

Le mode par défaut pour la division de chaîne Python utilise un espace blanc généralisé:

In [44]: ' 11  223    3'.split()
Out[44]: ['11', '223', '3']

Voici un exemple de csv avec un espacement constant (et une largeur variable)

In [45]: np.savetxt('test.csv',x,fmt='%d', delimiter=' ')

In [46]: cat test.csv
1 123 32
34 1 2
0 23 1000

np.genfromtxt('test.csv',dtype=None) le lit très bien.

3
hpaulj 15 janv. 2017 à 04:43