How to write a data file in Python

  • Context: Python 
  • Thread starter Thread starter javiergra24
  • Start date Start date
  • Tags Tags
    Data File Python
Click For Summary

Discussion Overview

The discussion revolves around writing data to a file in Python, specifically for the output of a Runge-Kutta script that simulates the Lorenz Equations. Participants are exploring methods to efficiently save time series data (t, x, y, z) into a single .dat file, addressing issues related to file output and execution speed.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant describes their attempt to save data using numpy's savetxt function but encounters issues with the output format and execution time.
  • Another participant suggests keeping data in arrays rather than lists and using hstack to combine them before writing to a file.
  • There are multiple attempts to correct the file writing process, with suggestions to use numpy's tofile method and to ensure data is saved in the correct format.
  • Concerns are raised about the performance of Python as an interpreted language, with a suggestion to consider compiled languages for better speed.
  • Participants discuss the need to consolidate data into a single file instead of multiple files, expressing frustration with the current approach.
  • One participant successfully runs a modified version of the script but still notes that execution time is an issue.
  • There are repeated clarifications about how to structure the code to save data outside of the loop to improve efficiency.

Areas of Agreement / Disagreement

Participants do not reach a consensus on the best method for saving data efficiently, as multiple approaches are suggested and some methods are reported to work while others do not. The discussion remains unresolved regarding the optimal solution.

Contextual Notes

Participants express uncertainty about the performance implications of different coding practices in Python, and there are mentions of unresolved issues with the specific implementation of file writing methods.

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 14 ·
Replies
14
Views
4K
  • · Replies 15 ·
Replies
15
Views
2K
  • · Replies 6 ·
Replies
6
Views
2K
  • · Replies 16 ·
Replies
16
Views
4K
  • · Replies 7 ·
Replies
7
Views
5K
  • · Replies 10 ·
Replies
10
Views
3K
  • · Replies 34 ·
2
Replies
34
Views
4K
Replies
3
Views
4K
  • · Replies 1 ·
Replies
1
Views
5K
  • · Replies 8 ·
Replies
8
Views
3K