[Numpy-discussion] Fortran binary files and numpy/scipy

Ryan May rmay31 at gmail.com
Mon Feb 2 14:38:14 EST 2009


Nils Wagner wrote:
> On Mon, 02 Feb 2009 10:17:13 -0600
>   Ryan May <rmay31 at gmail.com> wrote:
>> Every write statement in fortran first writes out the 
>> number of bytes that will
>> follow, *then* the actual data.  So, for instance, the 
>> first write to file in
>> your program will write the bytes corresponding to these 
>> values:
>>
>> 16 X(1) Y(1) Z(1)
>>
>> The 16 comes from the size of 2 ints and 1 double. 
>> Since you're always writing
>> out the 3 values, and they're always the same size, try 
>> adding another integer
>> column as the first field in your array.
>>
>> Ryan

> Hi Ryan,
> 
> I have modified the python script.
> 
> import numpy as np
> fname = open("bin.dat",'rb')
> dt = 
> np.dtype([('isize',int),('irow',int),('icol',int),('value',float)])
> a  = np.fromfile(fname,dtype=dt)
> 
> 
>>>> a
> array([(16, 1090921693195, 4643140847074803712, 
> 7.9050503334599447e-323),
>         (16, 1086626725900, 4638566878703255552, 
> 7.9050503334599447e-323),
>         (16, 1082331758605, 4635611391447793664, 
> 7.9050503334599447e-323),
>         (16, 1078036791310, 4633922541587529728, 
> 7.9050503334599447e-323),
>         (16, 1073741824015, 4632233691727265792, 
> 7.9050503334599447e-323),
>         (16, 1069446856720, 4630967054332067840, 
> 7.9050503334599447e-323),
>         (16, 1065151889425, 4630122629401935872, 
> 7.9050503334599447e-323),
>         (16, 1060856922130, 4629137466983448576, 
> 7.9050503334599447e-323),
>         (16, 1056561954835, 4628293042053316608, 
> 7.9050503334599447e-323),
>         (16, 1052266987540, 4627448617123184640, 
> 7.9050503334599447e-323)],
>        dtype=[('isize', '<i8'), ('irow', '<i8'), ('icol', 
> '<i8'), ('value', '<f8')])
> 
> Is this a 64-bit problem ?
> 

I don't know if it's a 64-bit problem per-se, so much as a disagreement between
fortran and numpy.  Numpy is making the size of the integer fields 8 bytes, while
in Fortran, they're only 4 bytes.  When constructing your dtype, use np.int32 or
'<i4' for your type for the integer fields, and see if that fixes it.

Ryan

-- 
Ryan May
Graduate Research Assistant
School of Meteorology
University of Oklahoma



More information about the NumPy-Discussion mailing list