Python How to write a data file in Python

  • Thread starter Thread starter javiergra24
  • Start date Start date
  • Tags Tags
    Data File Python
AI Thread Summary
A user is working on a Python script to solve the Lorenz Equations using the Runge-Kutta method and needs assistance with saving the output data (t, x, y, z) into a single .dat file. Initially, the user attempted to append data to lists and save them using numpy's savetxt function, but encountered issues with the output format and execution speed. Suggestions included using numpy's hstack to combine arrays and saving the data outside of the loop to improve performance. The user successfully modified their script to save the data in one file after the loop, resolving the initial problems with file output and execution time.
javiergra24
Messages
19
Reaction score
0
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.


Please can anyone help me?

Thank you
 
Technology news on Phys.org
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
 
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++.

I don't know enough about Python to say anything intelligible about your file I/O problem...
 
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(...)
 
Thanks for your answer but it doesn't work
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

javiergra24 said:
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.
 
Last edited:
story645 said:
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
 
javiergra24 said:
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]
 
  • #10
story645 said:
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
 

Similar threads

Replies
15
Views
2K
Replies
6
Views
2K
Replies
16
Views
4K
Replies
7
Views
5K
Replies
10
Views
2K
Replies
34
Views
3K
Replies
1
Views
4K
Back
Top