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

Nils Wagner nwagner at iam.uni-stuttgart.de
Mon Feb 2 14:58:17 EST 2009


On Mon, 02 Feb 2009 13:38:14 -0600
  Ryan May <rmay31 at gmail.com> wrote:
> 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.
> 

dt = 
np.dtype([('isize','int32'),('irow','int32'),('icol','int32'),('value','float')])


>>> a
array([(16, 0, 11, 1.2549267404367662e-321),
        (1081065472, 16, 0, 7.9050503334599447e-323),
        (12, 253, 0, 3.4485523805914514e-313),
        (0, 16, 0, 5.3474293932967148e-312),
        (0, 1079312384, 16, 3.3951932655444357e-313), (0, 
14, 251, 62.0),
        (16, 0, 16, 3.1829936864479085e-313),
        (250, 0, 1078525952, 7.9050503334599447e-323),
        (16, 0, 16, 1.2302234581447039e-321),
        (1078231040, 16, 0, 7.9050503334599447e-323),
        (17, 248, 0, 3.4484552433329538e-313),
        (0, 16, 0, 5.2413296037731544e-312),
        (0, 1077805056, 16, 3.3951932655444357e-313), (0, 
19, 246, 27.0),
        (16, 0, 16, 4.2439915819305446e-313),
        (245, 0, 1077411840, 7.9050503334599447e-323)],
       dtype=[('isize', '<i4'), ('irow', '<i4'), ('icol', 
'<i4'), ('value', '<f8')])

Any idea ?

  Nils



More information about the NumPy-Discussion mailing list