2017-01-15 21 views
-1

in Python, wenn ich sage np.array ([1,2,3]), ist das ErgebnisInconsistance Abstand in numpy Arrayelementen

array([1, 2, 3]) 

aber wenn ich sage np.array ([11 , 22,3]) das Ergebnis ist

array([11, 22, 3]) 

, die vor zwei Räume haben '3' im Gegensatz zu '22', die vor einen Raum hat. Später benutze ich map-Funktion, um dieses Ergebnis aus einer CSV-Datei mit Pandas zu lesen und ich brauche den Abstand konsistent zu sein. Gibt es einen Weg dazu?

+1

Wie speichern Sie es in CSV? Sie sollten dieses Format nicht in CSV speichern. Speichern Sie die Daten im CSV-Format, nicht im Anzeigeformular. – BrenBarn

+0

Ist die CSV-Datei tatsächlich so angeordnet, wie es beim "Repr" des Numy-Arrays der Fall ist? Dies scheint entweder ein Nicht-Problem (ein Problem, das nicht wirklich ein echtes Problem ist) oder du machst etwas sehr merkwürdiges mit deinem numpigen Array, das den Raum von seinem "repr" bewahrt. – Blckknght

+0

['pandas.DataFrame.to_csv()'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html) schreibt standardmäßig in das komprimierte CSV-Standardformat. Also wird 'array ([11, 22, 3])' ohne Header als '11,22,3' geschrieben. Dies ist kein Problem. – MattDMo

Antwort

1

Sie die gleichmäßig verteilte numpy Array zuerst in eine Liste umwandeln könnte:

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

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

geben Ihnen

Wenn Sie das Array numpy zuordnen, hat jeder an die Funktion übergebene Wert keinen Abstand, sodass Sie sich keine Gedanken darüber machen müssen.

BEARBEITEN: Editierte Liste Umwandlung zu verwenden numpy.array's method wie von hpaulj vorgeschlagen. Siehe hpaulj's answer below, da es viel umfassender ist als meins.

+0

Empfehlung von 'list (array ...)' ist keine gute Übung. 'array.tolist()' ist eine zuverlässigere Möglichkeit, ein Array in eine Liste umzuwandeln. Das Ergebnis ist dasselbe mit einem 1d-Array, aber versuchen Sie es mit 2d. Und ich sehe nicht, wie das bei der Interaktion mit Pandas hilft. – hpaulj

1

Die Standardanzeige für Arrays eine gleichmäßige Feldbreite pro Element, nicht ein gleichmäßiger Abstand:

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] 

Effektiv numpy ein Format wie verwendet:

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 ist, dass, nur unter Verwendung von die fmt und delimiter, die Sie bereitstellen.

csv steht für "Komma getrennt". Tabs werden ebenfalls verwendet. Wenn "white space" verwendet wird, sind gute Leser genauso glücklich mit einem, zwei oder mehr "Leerzeichen". Solche Tabellen werden normalerweise so formatiert, dass die Spalten ausgerichtet bleiben und der Abstand zwischen den Zahlen nicht konstant bleibt.

A 3 Reihenanordnung mit Misch Anzahl Größen:

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

Feste Breite CSV Formatierung:

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

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

begrenzt reading:

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

Der Standardmodus für Split Verwendungen Python Zeichenfolge verallgemeinerter Leerraum:

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

Hier ist ein Beispiel einer CSV mit konstantem Abstand (und variabler Breite)

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) liest es gut.

+0

Danke für Ihre gründliche Antwort – alireza