[Numpy-discussion] genfromtxt
Derek Homeier
derek at astro.physik.uni-goettingen.de
Tue Oct 11 12:27:04 EDT 2011
Hi Nils,
On 11 Oct 2011, at 16:34, Nils Wagner wrote:
> How do I use genfromtxt to read a file with the following
> lines
>
> 1 1 2.2592365264892578D+01
> 2 2 2.2592365264892578D+01
> 1 3 2.6666669845581055D+00
> 3 3 2.2592365264892578D+01
> 2 4 2.6666669845581055D+00
> 4 4 2.2592365264892578D+01
> 3 5 2.6666669845581055D+00
> 5 5 2.2592365264892578D+01
> 4 6 2.6666669845581055D+00
> 6 6 2.2592365264892578D+01
> 1 7 2.9814243316650391D+00
> 7 7 1.7259031295776367D+01
> 2 8 2.9814243316650391D+00
> 8 8 1.7259031295776367D+01
> ...
>
>
> names =("i","j","v")
> A =
> np.genfromtxt('bmll.mtl',dtype=[('i','int'),('j','int'),('v','d')],names=names)
> V = A[:]['v']
>
>>>> V
> array([ NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN,
> NaN, NaN, NaN,
> NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN,
> NaN, NaN, NaN,
> NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN,
> NaN, NaN, NaN,
> NaN, NaN, NaN])
>
> yields NaN, while
>
> convertfunc = lambda x: x.replace('D','E')
> names =("i","j","v")
> A =
> np.genfromtxt('bmll.mtl',dtype=[('i','int'),('j','int'),('v','|S24')],names=names,converters={"v":convertfunc})
> V = A[:]['v'].astype(float)
>>>> V
> array([ 22.59236526, 22.59236526, 2.66666698,
> 22.59236526,
> 2.66666698, 22.59236526, 2.66666698,
> 22.59236526,
> 2.66666698, 22.59236526, 2.98142433,
> 17.2590313 ,
> 2.98142433, 17.2590313 , 2.98142433,
> 2.98142433,
> 2.66666698, 22.59236526, 2.98142433,
> 2.98142433,
> 2.66666698, 22.59236526, 2.98142433,
> 2.98142433,
> 2.66666698, 22.59236526, 2.98142433,
> 2.98142433,
> 2.66666698, 22.59236526, 2.98142433,
> 2.66666698,
> 17.2590313 , 2.98142433, 2.66666698,
> 17.2590313 ])
>
>
> works fine.
took me a moment to figure out what the actual problem remaining was,
but expect you'd prefer it to load directly into a float record?
The problem is simply that the converter _replaces_ the default converter
function (which would be float(x) in this case), rather than operating on top of it.
Try instead
convertfunc = lambda x: float(x.replace('D','E'))
and you should be ready to use ('v', 'd') as dtype (BTW, specifying 'names'
is redundant in the above example).
This behaviour is only hinted at in the docstring example, so maybe the
documentation should be clearer here.
Cheers,
Derek
More information about the NumPy-Discussion
mailing list