2011-06-03 287 views
5

Tenga en cuenta la siguiente lista en Mathematica:Importar datos de txt a Mathematica

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

Ahora, invocar:

Export["test.dat", a] 

y luego

b = Import["test.dat"] 

verá que al final a no es igual a b. ¿Debería considerar esto como una característica o un error?

Por otra parte, me gustaría importar una lista que tiene el siguiente formato: {P1,P2,P3...,Pn} donde Pi={v1,v2,v3,...,vm} y cada vi={x,y,z} donde x,y,z son números que representan las coordenadas del vértice vi. Esta debería ser una lista de polígonos.

¿Cómo debo configurar mi archivo .dat para que pueda leerlo con Mathematica, y cómo debo leerlo? Traté de imitar la salida de Export["test.dat",a] anterior, pero luego descubrí el otro problema. Encontré esto question, pero no pude hacer que la respuesta funcione para mí ...

¿Alguna idea? ¡Gracias por adelantado!

Respuesta

4

Debe especificar el formato exacto en el que necesita importar/exportar, de lo contrario, es posible que Mathematica no adivine el formato correcto.

¿Entonces su pregunta se reduce a qué formato de texto es adecuado para almacenar matrices 3D?

Si trabaja con Mathematica, probablemente lo más fácil sea exportar la expresión utilizando la sintaxis de expresión de Mathematica, es decir, Export["data.m", a, "Package"]. Este formato es relativamente fácil de escribir desde otros idiomas (pero no es tan fácil de analizar). Su otra opción sería crear un nuevo formato de texto fácil de analizar para sus datos 3D, y escribir sus propias funciones de entrada/salida tanto en Mathematica como en los otros idiomas con los que necesite trabajar.

Dado que el formato de los datos que se está trabajando es fijo (que siempre tienen tripletas de coordenadas), la solución más sencilla puede ser simplemente aplanar su lista antes de exportar, y dividirla después de la importación, así:

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

Al imitar la salida de 'Export [" data.m ", a," Package "]' Pude hacer lo que quería. ¡Gracias! – Dror

+0

@Dror, pensé que también necesitaba leer sus archivos de datos con otro software. Si este no es el caso, y solo necesita almacenar/guardar los datos temporalmente, el formato "WDX" puede ser mucho más rápido de importar/exportar que "Paquete". Pero es binario, por lo que no podrá inspeccionarlo con un editor de texto ni importarlo a otros programas. "WDX" también puede almacenar cualquier tipo de expresión de Mathematica (creo). – Szabolcs

1

Usted puede hacer también, por ejemplo:

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}}} 
*) 

el beneficio adicional es que este método no requiere analizar el Import salida

+0

mientras esto * funciona * para este ejemplo específico, me parece realmente hacker y frágil. Lo que hace esto es básicamente construir una expresión MathML que, cuando se procesa, * se vea * más o menos como la expresión de Mathematica, luego vuelva a importarla. Uno solo puede esperar que la versión reimportada sea la misma ... Si tomamos este enfoque, es mucho mejor usar un formato no frágil, como simplemente usar el InputForm de la expresión (que es lo que se exporta al "Paquete" "formato lo hace). Por lo que puedo decir, "MathML" no tiene ventajas sobre esto, solo desventajas. – Szabolcs

+0

@Szabolcs Como el alcance de la pregunta es 'Importar datos de txt a Mathematica', creo que de esta manera es apropiado y funciona. El OP no está trabajando con 'expressions', sino solo' data' estructurado como Lists. –

+1

sin embargo, MathML está diseñado para (ambos) intercambiar y formatear expresiones matemáticas, no listas o matrices. Podría considerarse un accidente que esto funcione sin problemas ... ¿por qué crees que MathML es una mejor opción para representar matrices que todas las otras posibilidades legibles para el ser humano como InputForm ("Package"), ExpressionML, etc.? – Szabolcs

2

Para almacenar la expresión MMA me gustaría sugerir DumpSave (binario, depende del sistema), o SavePut, pero si desea utilizar la exportación Me convierto en una cadena de un y exportarlo como texto . (Yo uso ImportString y ExpertString a continuación, por lo que no necesito un archivo, pero funciona igual para Import y Export). IMO esto es sólido como una roca.

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

La lectura de su lista de polígonos debería funcionar de la misma:

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

¿cómo es esto diferente de exportar a un "paquete"? De hecho, acabo de descubrir la posibilidad de exportar a un formato de "paquete" (archivo .m), pero parece que es más o menos lo mismo. – Szabolcs

+1

@Szabolcs No tenía la menor idea ya que no tenía conocimiento de la opción de exportación a Paquete tampoco. Ahora he estudiado esta capacidad y creo que "Paquete" es el camino a seguir (si no le importa el comentario de Wolfram al principio del archivo). Por ejemplo, si exporta reales, las opciones de "Texto" exportan el formato de 6 dígitos, mientras que "Paquete" usa la precisión completa. –

1

También voy este problema. Mi solución es la siguiente:

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 

Espero que esto ayude. Atentamente.

Cuestiones relacionadas