[AstroPy] question on matplotlib's loadtxt
Derek Homeier
derek at astro.physik.uni-goettingen.de
Fri Nov 4 11:14:15 EDT 2011
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
More information about the AstroPy
mailing list