[AstroPy] question on matplotlib's loadtxt

Erin Sheldon erin.sheldon at gmail.com
Fri Nov 4 11:35:28 EDT 2011


This is the proper syntax, and works for me on your file:

  loadtxt('tmp/test.txt',dtype=[('x','f8'),('s','S5')], usecols=[0,5])

You need to give a proper dtype with full field description.

-e

On Fri, Nov 4, 2011 at 11:14 AM, Derek Homeier
<derek at astro.physik.uni-goettingen.de> wrote:
> Hi Grigoris,
>
>> Hello to all!  I would like to ask about an error I face with
>> matplotlib's loadtxt...
>>
>> Suppose that we have a file (called "test.test") with 6 columns like:
>>
>> 1496548.  862.235400937  14.008  0  20110523.201416  tth*g
>> 1690289.  919.424007603  13.875  0  20110523.221527  hgf4
>> 1667241.  996.262754039  13.890  0  20110524.001639  nb.mj
>> 739181.6  881.1753527  14.774  0  20110524.010203  vbfhg
>>
>> When I use
>> x, y = loadtxt('test.test', unpack=True, usecols=(0,1), dtype=(float,float))
>>
>> it prints normally the first and second column.
>> If I add another column like:
>>
>> x, y, z = loadtxt('test.test', unpack=True,usecols=(0,1,3),
>> dtype=(float,float,float))
>>
>> the output is this:
>>   File "/usr/lib/python2.7/site-packages/numpy/lib/io.py", line 584, in
>> loadtxt
>>     dtype = np.dtype(dtype)
>> TypeError: data type not understood
>>
> I don't quit understand that part, I admit - dtype only takes a single type or pairs of names and
> types, so it would seem the first case actually only worked by accident:
>
> In [193]: np.dtype((float,float))
> Out[193]: dtype('float64')
>
> I have no idea how it interprets the second float, but as you see it has no effect anyway.
> You could in fact get the same result with 'usecols=[0,1,3], dtype=float'
> which will simply apply the dtype to all columns (and is the default already...).
>>
>> Even if I use a dictionary, like:
>> dt = dtype({'names':['n1','n2','n3'],'formats':[float,float,float]})
>> x, y, z = loadtxt('test.test', unpack=True, usecols=(0,1,2) , dtype=dt)
>>
>> the output is the same as previous.
>>
> No things are getting strange - the above is the correct (and I think, only) way to
> define dtypes with different formats -
> np.dtype([('n1',float),('n2',float),('n3',float)])
> would be equivalent. As there is no error on the first line (i.e., dt is a valid dtype),
> this seems to be a bug in loadtxt. Could you check what happens if you try the
> above without the 'unpack' option? Should return a structured array with the 3
> fields 'n1','n2','n3'...
> Also (as loadtxt is actually part of numpy), which is your installed version of numpy
> (numpy.__version__ or np.__version__, you may have to re-import it as pylab
> unfortunately imports everything into one namespace). I recall that there have
> been issues with unpacking structured arrays prior to 1.6 or 1.6.1.
>
>> Additionaly, when I am trying to load the last column as strings:
>> x, y = loadtxt('test.test', delimiter='  ', unpack=True,usecols=(0,5),
>> dtype=(float,'S5'))
>>
>> I get this error:
>>   File "/usr/lib/python2.7/site-packages/numpy/lib/io.py", line 584, in
>> loadtxt
>>     dtype = np.dtype(dtype)
>> ValueError: mismatch in size of old and new data-descriptor
>>
>>
>> What am I doing wrong ? I am sorry if it is something really obvious ...
>> but I am unable to find it...
>
> Similar problem - this ought to work with dtype=[('n1', 'f'), ('n6','S5')] ; but it might
> be broken in the same way as above - if you can update to numpy 1.6.x, you
> should hopefully be set.
>
> HTH,
>                                                Derek
>
>
> _______________________________________________
> AstroPy mailing list
> AstroPy at scipy.org
> http://mail.scipy.org/mailman/listinfo/astropy
>



-- 
Erin Scott Sheldon
Brookhaven National Laboratory



More information about the AstroPy mailing list