## How to write a data file in Python

Hi guys

I've done a Runge-Kutta script for the Lorenz Equations in python, I need to write data for (t,x,y,z) in a .dat file in order to reprint in a table. How can a do it?

Imported routines are:

import sys, pylab, numpy
from pylab import *
from mpl_toolkits.mplot3d import Axes3D
from numpy import *
import matplotlib.pyplot as plt

Mi iteration code is:

for n in xrange(0,N):
# at each time step calculate new x(t),y(t),z(t)
# and append to lists x0, y0, z0
x,y,z = RKTwoD(x0[n],y0[n],z0[n],VDPXDot,VDPYDot,VDPZDot,dt)
x0.append(x)
y0.append(y)
z0.append(z)
t.append(t[n] + dt)
savetxt('output.dat', (t,x0,y0,z0))

But it doesn't work, file just contain six columns instead of four and it takes too long to execute the script.

Thank you

 PhysOrg.com science news on PhysOrg.com >> 'Whodunnit' of Irish potato famine solved>> The mammoth's lament: Study shows how cosmic impact sparked devastating climate change>> Curiosity Mars rover drills second rock target
 Blog Entries: 3 If you keep everything as an array instead of a list, basically take x0.append(x) y0.append(y) z0.append(z) and do a vstack or hstack at the end so table = hstack(x0,y0,z0) then you just need to write out table.tofile('output.dat') numpy lists don't write out straight to dats
 Thanks for your answer but it doesn't work I'm trying Code: import sys, pylab, numpy from pylab import * from mpl_toolkits.mplot3d import Axes3D from numpy import * import matplotlib.pyplot as plt #I'll use values of sigma = 6.0, beta = 3.0 and rho = 36 # The Lorenz Equations are dx/dt=sigma*(y-x) ; dy/dt=x*(rho-z)-y ; dz/dt=x*y-beta*z def VDPXDot(x,y,z): return 6.0 * (y-x) def VDPYDot(x,y,z): return x * (40.0 - z)- y def VDPZDot(x,y,z): return x * y - 3.0 * z # 3D Fourth-Order Runge-Kutta Integrator def RKTwoD(x,y,z,f,g,m,dt): #9 operaciones k1x = dt * f(x,y,z) k1y = dt * g(x,y,z) k1z = dt * m(x,y,z) #15 operaciones k2x = dt * f(x + k1x / 2.0,y + k1y / 2.0,z + k1z / 2.0) k2y = dt * g(x + k1x / 2.0,y + k1y / 2.0,z + k1z / 2.0) k2z = dt * m(x + k1x / 2.0,y + k1y / 2.0,z + k1z / 2.0) #15 operaciones k3x = dt * f(x + k2x / 2.0,y + k2y / 2.0,z + k2z / 2.0) k3y = dt * g(x + k2x / 2.0,y + k2y / 2.0,z + k2z / 2.0) k3z = dt * m(x + k2x / 2.0,y + k2y / 2.0,z + k2z / 2.0) #12 operaciones k4x = dt * f(x + k3x,y + k3y,z + k3z) k4y = dt * g(x + k3x,y + k3y,z + k3z) k4z = dt * m(x + k3x,y + k3y,z + k3z) #12 operaciones x = x + ( k1x + 2.0 * k2x + 2.0 * k3x + k4x ) / 6.0 y = y + ( k1y + 2.0 * k2y + 2.0 * k3y + k4y ) / 6.0 z = z + ( k1z + 2.0 * k2z + 2.0 * k3z + k4z ) / 6.0 return x,y,z dt = 0.002 x0 = [0.0] y0 = [1.0] z0 = [0.0] t = [0.0] N = 20000 for n in xrange(0,N): # at each time step calculate new x(t),y(t),z(t) # and append to lists x0, y0, z0 x,y,z = RKTwoD(x0[n],y0[n],z0[n],VDPXDot,VDPYDot,VDPZDot,dt) x0.append(x) y0.append(y) z0.append(z) t.append(t[n] + dt) m1 = array(x0) m2 = array(y0) m3 = array(z0) m4 = array(t) m1.tofile("putamierdax.dat", sep='\n', format = "%e") m2.tofile("putamierday.dat", sep='\n', format = "%e") m3.tofile("putamierdaz.dat", sep='\n', format = "%e") It works but the script time is too long and I've got to work with three files

Mentor

## How to write a data file in Python

My understanding is that Python is an interpreted language, so if you have a loop that runs for many iterations, it's going to take a long time. The way around that is to use a language that is compiled, such as C or C++.

 Thanks for your answer Mark44 No matter if the script takes too much time (I'm doing the script also for C++ and Java), but there must be some way to save all data in a unique file. By splitting it in four I have to use Ultraedit and it's a bit tiring..
 look into numpy.savetxt(...)

Blog Entries: 3
Sorry, I gave you the wrong args. It should be:
table = hstack([x0,y0,z0,t])

but when you open it, you need to specify the size of the array and make sure it's saved and unpacked as the right type.
you can also look into scipy.io.savemat

 Quote by javiergra24 It works but the script time is too long and I've got to work with three files
I just ran your script and it took supershort, so I'm thinking the bug is that you're running this:
Code:
  m1 = array(x0)
m2 = array(y0)
m3 = array(z0)
m4 = array(t)
m1.tofile("putamierdax.dat", sep='\n', format = "%e")
m2.tofile("putamierday.dat", sep='\n', format = "%e")
m3.tofile("putamierdaz.dat", sep='\n', format = "%e")
in the for loop.

 Quote by story645 Sorry, I gave you the wrong args. It should be: table = hstack([x0,y0,z0,t]) but when you open it, you need to specify the size of the array and make sure it's saved and unpacked as the right type. you can also look into scipy.io.savemat I just ran your script and it took supershort, so I'm thinking the bug is that you're running this: Code:  m1 = array(x0) m2 = array(y0) m3 = array(z0) m4 = array(t) m1.tofile("putamierdax.dat", sep='\n', format = "%e") m2.tofile("putamierday.dat", sep='\n', format = "%e") m3.tofile("putamierdaz.dat", sep='\n', format = "%e") in the for loop.
How can I run the data saving script outside the for loop?

Thank you

Blog Entries: 3
 Quote by javiergra24 How can I run the data saving script outside the for loop?
Just unindent it, so:
Code:
for n in xrange(0,N):
x,y,z = RKTwoD(x0[n],y0[n],z0[n],VDPXDot,VDPYDot,VDPZDot,dt)
x0.append(x)
y0.append(y)
z0.append(z)
t.append(t[n] + dt)

m1 = array(x0)
m2 = array(y0)
m3 = array(z0)
m4 = array(t)
m1.tofile("putamierdax.dat", sep='\n', format = "%e")
m2.tofile("putamierday.dat", sep='\n', format = "%e")
m3.tofile("putamierdaz.dat", sep='\n', format = "%e")
[/code]

 Quote by story645 Just unindent it, so: Code: for n in xrange(0,N): x,y,z = RKTwoD(x0[n],y0[n],z0[n],VDPXDot,VDPYDot,VDPZDot,dt) x0.append(x) y0.append(y) z0.append(z) t.append(t[n] + dt) m1 = array(x0) m2 = array(y0) m3 = array(z0) m4 = array(t) m1.tofile("putamierdax.dat", sep='\n', format = "%e") m2.tofile("putamierday.dat", sep='\n', format = "%e") m3.tofile("putamierdaz.dat", sep='\n', format = "%e") [/code]
Thank you very much!! So simple and I didn't notice