2016-03-31 2 views
1

Ich habe eine riesige numpy Reihe von Schwimmern, sagen ~ 1500 * 2500px und ich möchteWie serialisiert man ein numpy Array von Floats zu einem String?

  1. convert dieses Array zu einem list (wie JavaScript) (zB [[0.1,0.3,0.2],[0.1,0.3,0.2]])
  2. serialize es für eine in einen String POST-Anfrage an einen Server.

Ich weiß nicht, wie es geht (1). Für (2) habe ich einen Blick auf die Funktionen numpy.array_str(), array2string() und array_repr() geworfen, und sie geben Darstellungen des Arrays zurück, aber nicht das vollständige Array.

Wie soll ich das tun?

+0

Was ist Ihre erwartete Zeichenfolge? –

Antwort

-1

Sie können es zu einem normalen Python-Liste konvertieren und dann in einen String

arr = np.random.rand((10,10)) 
final_string = str(arr.tolist()) 

was

[[,7998950511604668, ,3504357174428122, ,4516363276829708, ,42090556177992977], [,5151195486975273, ,7101183117731774, ,9530575343271824 , 0,39869760958795464], [0,20318293100519536, 0,17244659329654555, ,3530236209359401, ,2081303162461341], [,9186758779272243, ,9300730012004015, ,14121513893149895, ,39315493832613735]]

+2

Die Standardzeichenfolgendarstellungen von Pythonobjekten sind eine etwas volatile Wahl für die Serialisierung. 'json.dumps' würde einen stabileren Ansatz bieten, obwohl es im Moment das gleiche Ergebnis liefern würde. –

1

Ich bin nicht sicher, warum Sie wollen, dass "dieses Array [aussehen?] Wie ein JavaScript-Array, also nehme ich an (wie ich in Ermangelung von gegenteiligen Informationen tun kann), dass Sie wünschen um das Array an einen unglücklichen Front-End-Prozess zu kommunizieren: Fast vier Millionen Elemente sind immer noch eine signifikante Menge an Daten, die über Netzwerk-Pipes hinweg gesplittet werden. Also, wie immer, ein Hintergrund für das Problem wäre hilfreich (und Sie können Ihre Frage bearbeiten, um es bereitzustellen).

Angenommen, Sie möchten die Daten für die Übertragung oder Speicherung serialisieren, dann ist der einfachste Weg, es als String verständlich JavaScript (ich habe nicht wissen, was "[look?] Wie" gemeint) verwendet die json Standard Bibliothek. Da dies nativ nichts anderes als list und dicts von ints, floats, Wahrheitswerten und Strings codieren kann, steht man immer noch vor dem Problem, wie man die Matrix am besten als eine Liste von Listen darstellt.

Kleines Beispiel, aber Sie müssen akzeptieren, dass dies ein zufälliger Schuss im Dunkeln ist.Erste sich ein überschaubaren Daten erstellen gesetzt, mit arbeiten:

a = np.random.randn(4, 5) 

Dies kann nicht direkt in JSON dargestellt werden:

import json 
try: 
    json.dumps(a) 
except Exception as e: 
    print "Exception", e 

in den ziemlich ausführlichen resultierenden (es ist wahrscheinlich nur das repr Objekt aufrufe), aber verständlich und wahre Botschaft

Exception array([[ 1.24064541, 0.97989932, -0.8469167 , -0.27318908, 1.21954134], 
     [-1.30172725, 0.41261504, 1.39895842, 0.75260258, -1.34749298], 
     [-0.38415007, -0.56925321, -1.59202204, 1.29900292, 1.91357277], 
     [ 1.06254537, 2.75700739, -0.66371951, 1.36906192, -0.3973517 ]]) is not JSON serializable 

Wenn wir den Dolmetscher fragen sie das Array in eine Liste zu konvertieren es macht einen halbherzig Job, sie in eine Liste von Array-Objekte umzuwandeln:

list(a) 

zeigt als Ergebnis

[array([ 1.24064541, 0.97989932, -0.8469167 , -0.27318908, 1.21954134]), 
array([-1.30172725, 0.41261504, 1.39895842, 0.75260258, -1.34749298]), 
array([-0.38415007, -0.56925321, -1.59202204, 1.29900292, 1.91357277]), 
array([ 1.06254537, 2.75700739, -0.66371951, 1.36906192, -0.3973517 ])] 

die gleiche Funktion Mit jene Arrays in Listen ergibt sich eine nutzbare Liste von Listen zu konvertieren:

list(list(r) for r in a) 

Auswertung zu

[[1.2406454087805279, 
    0.97989932000522928, 
    -0.84691669720415574, 
    -0.27318907894171163, 
    1.219541337120247], 
[-1.3017272505660062, 
    0.41261503624079976, 
    1.3989584188044133, 
    0.75260257672408482, 
    -1.3474929807527067], 
[-0.38415007296182629, 
    -0.56925320938196644, 
    -1.5920220380072485, 
    1.2990029230603588, 
    1.9135727724853433], 
[1.0625453748520415, 
    2.7570073901625185, 
    -0.66371950666590918, 
    1.3690619178580901, 
    -0.39735169991907082]] 

Dies ist zu JSON eminent Cabrio, das ich durch Umwandlung in einen String hier tun:

json.dumps(list(list(r) for r in a)) 

, die die (string) führen

'[[1.2406454087805279, 0.97989932000522928, -0.84691669720415574, -0.27318907894171163, 1.219541337120247], [-1.3017272505660062, 0.41261503624079976, 1.3989584188044133, 0.75260257672408482, -1.3474929807527067], [-0.38415007296182629, -0.56925320938196644, -1.5920220380072485, 1.2990029230603588, 1.9135727724853433], [1.0625453748520415, 2.7570073901625185, -0.66371950666590918, 1.3690619178580901, -0.39735169991907082]]' 

gibt können Sie überprüfen, ob das Ergebnis korrekt ist durch Rekonstruieren der Liste von Listen und Vergleichen mit dem Array (da eines der Argumente ein numpy Array ist, wird der Vergleich elementweise durchgeführt):

s = json.dumps(list(list(r) for r in a)) 
lofls = json.loads(s) 
lofls == a 

array([[ True, True, True, True, True], 
     [ True, True, True, True, True], 
     [ True, True, True, True, True], 
     [ True, True, True, True, True]], dtype=bool) 

Haben Sie Ihre Frage richtig verstanden?

Verwandte Themen