2011-06-03 12 views
5

Considerare l'elenco seguente in matematica:Importa dati da txt a Mathematica

a = { 
    { 
    {0, 0, 0}, {1, 0, 0}, {1, 1, 0} 
    }, 
    { 
    {0, 0, 1}, {1, 0, 1}, {1, 1, 1} 
    } 
    }; 

Ora, richiamare:

Export["test.dat", a] 

e poi

b = Import["test.dat"] 

vedrete che alla fine a non corrisponde a b. Dovrei considerare questo come una caratteristica o un bug?

Inoltre, desidero importare un elenco avente il seguente formato: {P1,P2,P3...,Pn} dove Pi={v1,v2,v3,...,vm} e ogni vi={x,y,z} dove x,y,z sono numeri che rappresentano le coordinate del vertice vi. Questo dovrebbe essere un elenco di poligoni.

Come devo impostare il mio file .dat così posso leggerlo con Mathematica e come devo leggerlo? Ho provato a imitare l'output di Export["test.dat",a] sopra, ma poi ho scoperto l'altro problema. Ho trovato questo question, ma non riuscivo a far funzionare la risposta per me ...

Qualche idea? Grazie in anticipo!

risposta

4

È necessario specificare il formato esatto che è necessario importare/esportare, altrimenti Mathematica potrebbe non essere in grado di indovinare il formato corretto.

Quindi la tua domanda si riduce a quale formato testuale è adatto per la memorizzazione di array 3D?

Se si lavora con Mathematica, probabilmente la cosa più semplice da fare è esportare l'espressione utilizzando la sintassi di espressione di Mathematica, ad esempio Export["data.m", a, "Package"]. Questo formato è relativamente facile da scrivere da altre lingue (ma non è così facile da analizzare). La tua altra opzione sarebbe quella di creare un nuovo formato testuale facile da analizzare per i tuoi dati 3D, e scrivere le tue funzioni di input/output per esso sia in Mathematica che nelle altre lingue con cui hai bisogno di lavorare.

Poiché il formato dei dati si sta lavorando è fisso (avete sempre coordinare tre gemelli), la soluzione più semplice potrebbe essere quella di appiattire appena fuori la vostra lista prima di esportare, la partizione e dopo l'importazione, in questo modo:

Export["test.txt", Join @@@ a, "Table"] 
b = Import["text.txt", "Table"] 
Partition[#, 3]& /@ a 
+0

Imitando l'output di "Export [" data.m ", a," Pacchetto "]" Sono riuscito a fare ciò che volevo. Grazie! – Dror

+0

@Dror, ho pensato che tu abbia bisogno di leggere i tuoi file di dati anche con altri software. Se questo non è il caso, e hai solo bisogno di memorizzare/salvare temporaneamente i dati, il formato "WDX" potrebbe essere molto più veloce da importare/esportare rispetto a "Pacchetto". Ma è binario, quindi non sarai in grado di ispezionarlo con un editor di testo o importarlo in altri programmi. "WDX" può anche memorizzare qualsiasi tipo di espressione Mathematica (credo). – Szabolcs

1

si può anche fare, ad esempio:

a={{{0,0,0},{1,0,0},{1,1,0}},{{0,0,1},{1,0,1},{1,1,1}}}; 

Export["c:\\test.dat",a,"MathML"]; 
[email protected]["c:\\test.dat","MathML"] 

(* 
->{{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}}, {{0, 0, 1}, {1, 0, 1}, {1, 1, 1}}} 
*) 

l'ulteriore vantaggio è che questo metodo non richiede l'analisi del Import uscita

+0

mentre questo * funziona * per questo specifico esempio, mi sembra davvero maneggevole e fragile. Ciò che fa è fondamentalmente costruire un'espressione MathML che, quando renderizzata, * sembra * più o meno come l'espressione Mathematica, quindi reimportarla. Si può solo sperare che la versione reimportata sia la stessa ... Se adottiamo questo approccio è molto meglio usare un formato non fragile, come semplicemente usando l'InputForm dell'espressione (che è ciò che esporta nel "Pacchetto" "il formato fa). Per quanto ne so, "MathML" non ha vantaggi su questo, solo svantaggi. – Szabolcs

+0

@Szabolcs Poiché l'ambito della domanda è "Importa dati da txt a Mathematica", penso che questo metodo sia appropriato e funzionante. L'OP non funziona con 'espressioni ', ma solo' dati' strutturati come elenchi. –

+1

tuttavia, MathML è progettato per (entrambi) lo scambio e la formattazione di espressioni matematiche, non liste o array. Potrebbe essere considerato un incidente che funzioni senza problemi ... perché pensi che il MathML sia una scelta migliore per rappresentare gli array rispetto a tutte le altre possibilità leggibili dall'uomo come InputForm ("Pacchetto"), ExpressionML, ecc.? – Szabolcs

2

Per la memorizzazione di espressione MMA Io suggerirei DumpSave (binario, dipende dal sistema), Save o Put, ma se si desidera utilizzare Export mi piacerebbe convertire un una stringa , e l'esportazione che, come testo. (Io uso ImportString e ExpertString di seguito, in modo che non ho bisogno di un file, ma funziona allo stesso modo per Import e Export). IMO questo è solido come una roccia.

a = {{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}}, {{0, 0, 1}, {1, 0, 1}, {1, 1, 1}}}; 
b = [email protected][ExportString[a // ToString, "Text"], "Text"] 

(* ==> 
{{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}}, {{0, 0, 1}, {1, 0, 1}, {1, 1, 1}}} 
*) 

a == b 

(* ==> True *) 

Leggendo l'elenco poligono dovrebbe funzionare lo stesso:

b = [email protected]["test.dat", "Text"] 
+0

in che modo è diverso dall'esportazione in un "Pacchetto"? In realtà ho appena scoperto la possibilità di esportare in un formato "Pacchetto" (file .m), ma sembra fare lo stesso. – Szabolcs

+1

@Szabolcs Non ho avuto la minima idea perché non ero a conoscenza dell'esportazione in opzione pacchetto. Ho studiato questa capacità e sento che "Package" è la strada da percorrere (se non ti dispiace il commento di Wolfram all'inizio del file). Ad esempio, se si esportano real, le opzioni "Testo" esporta il formato a 6 cifre mentre "Pacchetto" utilizza la massima accuratezza. –

1

Vado anche questo problema. La mia soluzione è la seguente:

IN[]: a = {{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}}, {{0, 0, 1}, {1, 0, 1}, {1, 1, 1}}}; 
     Export["test.dat", a, "List"]; 
     b = [email protected]["test.dat", "List"]; 
     a == b 

Out[]: True 

Spero che questo aiuti. I migliori saluti.

Problemi correlati