[numpy-discussion] Transform 3d data

Hello everyone, I have the following problem: I acquire a (evenly spaced) 3d field of 3d vectors from a HDF5 data file:
import tables field=tables.openFile("test.h5").root.YeeMagField.read()
now, the data is organized in "nested arrays"... so, when I have, say, 300 data points on the x-axis, 200 data points on the y-axis and 100 data points on the z-axis, I get an array with the shape
field.shape (300, 200, 100, 3)
When I now want to see a 3D arrow-plot of this field, I use:
from enthought.mayavi import mlab as m x,y,z=field.transpose() m.quiver3d(x,y,z)
and this works just fine. Here, the arrays (x and y and z) *each* contain one field component (i,e. into one spatial direction) at 300x200x100 points in a 3D array. Now, I would like to have this data in another format, so I can for example save it to a textfile with pylab.savetxt. What I would like are six arrays, each 1d, three for the coordinates and three for the field components. Since I didn't know any better, I wrote the following procedure: def transform_3d_data_(field,lowerBounds,upperBounds): #field is the same as above, lowerBounds and upperBounds each contain three values for x,y,z min/max import pylab as p xx,yy,zz,ex,ey,ez=list(),list(),list(),list(),list(),list() #xx,yy,zz will become the spatial coordinates, ex,ey,ez will become the field components for xi in range(field.shape[0]): #for each x coordinate... for yi in range(field.shape[1]): #for each y coordinate... for zi in range(field.shape[2]): #for each z coordinate... xx.append(lowerBounds[0]+xi*(upperBounds[0]-lowerBounds[0])/float(field.shape[0])) #append this yy.append(lowerBounds[1]+yi*(upperBounds[1]-lowerBounds[1])/float(field.shape[1])) #x, y, z coordinate zz.append(lowerBounds[2]+zi*(upperBounds[2]-lowerBounds[2])/float(field.shape[2])) #to xx, yy, zz .... ex.append(field[xi][yi][zi][0]) #and also ey.append(field[xi][yi][zi][1]) #add this field composition ez.append(field[xi][yi][zi][2]) #to ex, ey, ez. xx,yy,zz,ex,ey,ez=[p.array(_) for _ in [xx,yy,zz,ex,ey,ez]] return xx,yy,zz,ex,ey,ez , so I get the desired six 1D-arrays xx,yy,zz for the coordinates and ex,ey,ez for the field components. It works. Now my question: there has to be a better way to get this re-organization, right? This one here is much too slow, obviously. Is there maybe a single command for pylab that does this? Thanks in advance, cheers Thomas PS. I'm new to this messaging board, and I was wondering if there is a "normal" forum as well? I can't even search through the archives at http://mail.scipy.org/pipermail/numpy-discussion/ :( have there ever been discussions/initiatives about porting the mailing list archives for example to a phpBB based forum?

You can aid mgrid, riughy as the follows (I may have mistakes, but the direction should be clear): def transform_3d_data_(field,lwrbnd,uprbnd): shape = field.shape XYZ = np.mgrid[lwrbnd[0]:uprbnd[0]:shape[0], lwrbnd[1]:uprbnd[1]:shape[1], lwrbnd[2]:uprbnd[2]:shape[2]] vectors = fields.reshape(-1,3) np.savetxt(np.hstack((XYZ.reshape(3,-1).T, vectors))) Nadav -----Original Message----- From: numpy-discussion-bounces@scipy.org on behalf of Thomas Königstein Sent: Tue 19-Oct-10 12:05 To: numpy-discussion@scipy.org Subject: [Numpy-discussion] [numpy-discussion] Transform 3d data Hello everyone, I have the following problem: I acquire a (evenly spaced) 3d field of 3d vectors from a HDF5 data file:
import tables field=tables.openFile("test.h5").root.YeeMagField.read()
now, the data is organized in "nested arrays"... so, when I have, say, 300 data points on the x-axis, 200 data points on the y-axis and 100 data points on the z-axis, I get an array with the shape
field.shape (300, 200, 100, 3)
When I now want to see a 3D arrow-plot of this field, I use:
from enthought.mayavi import mlab as m x,y,z=field.transpose() m.quiver3d(x,y,z)
and this works just fine. Here, the arrays (x and y and z) *each* contain one field component (i,e. into one spatial direction) at 300x200x100 points in a 3D array. Now, I would like to have this data in another format, so I can for example save it to a textfile with pylab.savetxt. What I would like are six arrays, each 1d, three for the coordinates and three for the field components. Since I didn't know any better, I wrote the following procedure: def transform_3d_data_(field,lowerBounds,upperBounds): #field is the same as above, lowerBounds and upperBounds each contain three values for x,y,z min/max import pylab as p xx,yy,zz,ex,ey,ez=list(),list(),list(),list(),list(),list() #xx,yy,zz will become the spatial coordinates, ex,ey,ez will become the field components for xi in range(field.shape[0]): #for each x coordinate... for yi in range(field.shape[1]): #for each y coordinate... for zi in range(field.shape[2]): #for each z coordinate... xx.append(lowerBounds[0]+xi*(upperBounds[0]-lowerBounds[0])/float(field.shape[0])) #append this yy.append(lowerBounds[1]+yi*(upperBounds[1]-lowerBounds[1])/float(field.shape[1])) #x, y, z coordinate zz.append(lowerBounds[2]+zi*(upperBounds[2]-lowerBounds[2])/float(field.shape[2])) #to xx, yy, zz .... ex.append(field[xi][yi][zi][0]) #and also ey.append(field[xi][yi][zi][1]) #add this field composition ez.append(field[xi][yi][zi][2]) #to ex, ey, ez. xx,yy,zz,ex,ey,ez=[p.array(_) for _ in [xx,yy,zz,ex,ey,ez]] return xx,yy,zz,ex,ey,ez , so I get the desired six 1D-arrays xx,yy,zz for the coordinates and ex,ey,ez for the field components. It works. Now my question: there has to be a better way to get this re-organization, right? This one here is much too slow, obviously. Is there maybe a single command for pylab that does this? Thanks in advance, cheers Thomas PS. I'm new to this messaging board, and I was wondering if there is a "normal" forum as well? I can't even search through the archives at http://mail.scipy.org/pipermail/numpy-discussion/ :( have there ever been discussions/initiatives about porting the mailing list archives for example to a phpBB based forum?

Of course there is an (at least one) error: the line should be: XYZ = np.mgrid[lwrbnd[0]:uprbnd[0]:shape[0]*1j,lwrbnd[1]:uprbnd[1]:shape[1]*1j, lwrbnd[2]:uprbnd[2]:shape[2]*1j] On Tue, 2010-10-19 at 14:10 +0200, Nadav Horesh wrote:
You can aid mgrid, riughy as the follows (I may have mistakes, but the direction should be clear):
def transform_3d_data_(field,lwrbnd,uprbnd): shape = field.shape XYZ = np.mgrid[lwrbnd[0]:uprbnd[0]:shape[0], lwrbnd[1]:uprbnd[1]:shape[1], lwrbnd[2]:uprbnd[2]:shape[2]] vectors = fields.reshape(-1,3) np.savetxt(np.hstack((XYZ.reshape(3,-1).T, vectors)))
Nadav
-----Original Message----- From: numpy-discussion-bounces@scipy.org on behalf of Thomas Königstein Sent: Tue 19-Oct-10 12:05 To: numpy-discussion@scipy.org Subject: [Numpy-discussion] [numpy-discussion] Transform 3d data
Hello everyone,
I have the following problem:
I acquire a (evenly spaced) 3d field of 3d vectors from a HDF5 data file:
import tables field=tables.openFile("test.h5").root.YeeMagField.read()
now, the data is organized in "nested arrays"... so, when I have, say, 300 data points on the x-axis, 200 data points on the y-axis and 100 data points on the z-axis, I get an array with the shape
field.shape (300, 200, 100, 3)
When I now want to see a 3D arrow-plot of this field, I use:
from enthought.mayavi import mlab as m x,y,z=field.transpose() m.quiver3d(x,y,z)
and this works just fine. Here, the arrays (x and y and z) *each* contain one field component (i,e. into one spatial direction) at 300x200x100 points in a 3D array.
Now, I would like to have this data in another format, so I can for example save it to a textfile with pylab.savetxt. What I would like are six arrays, each 1d, three for the coordinates and three for the field components. Since I didn't know any better, I wrote the following procedure:
def transform_3d_data_(field,lowerBounds,upperBounds): #field is the same as above, lowerBounds and upperBounds each contain three values for x,y,z min/max import pylab as p xx,yy,zz,ex,ey,ez=list(),list(),list(),list(),list(),list() #xx,yy,zz will become the spatial coordinates, ex,ey,ez will become the field components for xi in range(field.shape[0]): #for each x coordinate... for yi in range(field.shape[1]): #for each y coordinate... for zi in range(field.shape[2]): #for each z coordinate...
xx.append(lowerBounds[0]+xi*(upperBounds[0]-lowerBounds[0])/float(field.shape[0])) #append this
yy.append(lowerBounds[1]+yi*(upperBounds[1]-lowerBounds[1])/float(field.shape[1])) #x, y, z coordinate
zz.append(lowerBounds[2]+zi*(upperBounds[2]-lowerBounds[2])/float(field.shape[2])) #to xx, yy, zz .... ex.append(field[xi][yi][zi][0]) #and also ey.append(field[xi][yi][zi][1]) #add this field composition ez.append(field[xi][yi][zi][2]) #to ex, ey, ez. xx,yy,zz,ex,ey,ez=[p.array(_) for _ in [xx,yy,zz,ex,ey,ez]] return xx,yy,zz,ex,ey,ez
, so I get the desired six 1D-arrays xx,yy,zz for the coordinates and ex,ey,ez for the field components. It works.
Now my question: there has to be a better way to get this re-organization, right? This one here is much too slow, obviously. Is there maybe a single command for pylab that does this?
Thanks in advance, cheers
Thomas
PS. I'm new to this messaging board, and I was wondering if there is a "normal" forum as well? I can't even search through the archives at http://mail.scipy.org/pipermail/numpy-discussion/ :( have there ever been discussions/initiatives about porting the mailing list archives for example to a phpBB based forum?

Wow, thanks a million, this worked just fine and I think I understood at least parts of the method :) Cheers Thomas * On Tue, 2010-10-19 at 14:20 +0200, Nadav Horesh wrote:
Of course there is an (at least one) error:
*
the line should be:
XYZ = np.mgrid[lwrbnd[0]:uprbnd[0]:shape[0]*1j,lwrbnd[1]:uprbnd[1]:shape[1]*1j, lwrbnd[2]:uprbnd[2]:shape[2]*1j]
On Tue, 2010-10-19 at 14:10 +0200, Nadav Horesh wrote:
* You can aid mgrid, riughy as the follows (I may have mistakes, but the*> >* direction should be clear):*> >* *> >* def transform_3d_data_(field,lwrbnd,uprbnd): *> >* shape = field.shape *> >* XYZ = np.mgrid[lwrbnd[0]:uprbnd[0]:shape[0],*> >* lwrbnd[1]:uprbnd[1]:shape[1], lwrbnd[2]:uprbnd[2]:shape[2]] *>* **
** vectors = fields.reshape(-1,3) *
* np.savetxt(np.hstack((XYZ.reshape(3,-1).T, vectors)))*> >* *> >* *> >* Nadav *
participants (2)
-
Nadav Horesh
-
Thomas Königstein