[Numpy-discussion] loadtxt() behavior on single-line files

Benjamin Root ben.root at ou.edu
Tue Jul 27 12:58:56 EDT 2010


On Thu, Jun 24, 2010 at 1:53 PM, Benjamin Root <ben.root at ou.edu> wrote:

> On Thu, Jun 24, 2010 at 1:00 PM, Warren Weckesser <
> warren.weckesser at enthought.com> wrote:
>
>> Benjamin Root wrote:
>> > Hi,
>> >
>> > I was having the hardest time trying to figure out an intermittent bug
>> > in one of my programs.  Essentially, in some situations, it was
>> > throwing an error saying that the array object was not an array.  It
>> > took me a while, but then I figured out that my program was assuming
>> > that the object returned from a loadtxt() call was always a structured
>> > array (I was using dtypes).  However, if the data file being loaded
>> > only had one data record, then all you get back is a structured record.
>> >
>> > import numpy as np
>> > from StringIO import StringIO
>> >
>> > strData = StringIO("89.23 47.2\n13.2 42.2")
>> > a = np.loadtxt(strData, dtype=[('x', float), ('y', float)])
>> > print "Length Two"
>> > print a
>> > print a.shape
>> > print len(a)
>> >
>> > strData = StringIO("53.2 49.2")
>> > a = np.loadtxt(strData, dtype=[('x', float), ('y', float)])
>> > print "\n\nLength One"
>> > print a
>> > print a.shape
>> > try :
>> >     print len(a)
>> > except TypeError as err
>> >     print "ERROR:", err
>> >
>> > Which gets me this output:
>> >
>> > Length Two
>> > [(89.230000000000004, 47.200000000000003)
>> >  (13.199999999999999, 42.200000000000003)]
>> > (2,)
>> > 2
>> >
>> >
>> > Length One
>> > (53.200000000000003, 49.200000000000003)
>> > ()
>> > ERROR: len() of unsized object
>> >
>> >
>> > Note that this isn't restricted to structured arrays.  For regular
>> > ndarrays, loadtxt() appears to mimic the behavior of np.squeeze():
>>
>> Exactly.  The last four lines of the function are:
>>
>>    X = np.squeeze(X)
>>    if unpack:
>>        return X.T
>>    else:
>>        return X
>>
>> >
>> > >>> a = np.ones((1, 1, 1))
>> > >>> np.squeeze(a)[0]
>> > IndexError: 0-d arrays can't be indexed
>> >
>> > >>> strData = StringIO("53.2")
>> > >>> a = np.loadtxt(strData)
>> > >>> a[0]
>> > IndexError: 0-d arrays can't be indexed
>> >
>> > So, if you have multiple lines with multiple columns, you get a 2-D
>> > array, as expected.
>> > if you have a single line of data with multiple columns, you get a 1-D
>> > array.
>> > If you have a single column with many lines, you also get a 1-D array
>> > (which is probably expected, I guess).
>> > If you have a single column with a single line, you get a scalar
>> > (actually, a 0-D array).
>> >
>> > Is this a bug or a feature?  I can see the advantages of having
>> > loadtxt() returning the lowest # of dimensions that can hold the given
>> > data, but it leaves the code vulnerable to certain edge cases.  Maybe
>> > there is a different way I should be doing this, but I feel that this
>> > behavior at the very least should be included in the loadtxt
>> > documentation.
>> >
>>
>> It would be useful to be able to tell loadtxt to not call squeeze, so a
>> program that reads column-formatted data doesn't have to treat the case
>> of a single line specially.
>>
>> Warren
>>
>
> I don't know if that is the best way to solve the problem.  In that case,
> you would always get a 2-D array, right?  Is that useful for those who have
> text data as a single column?  Maybe a mindim keyword (with None as default)
> and apply an appropriate "atleast_Nd()" call (or maybe have available an
> .atleast_nd() function?).  But, then what would this mean for structured
> arrays?  One might think that they want at least 2-D, but they really want
> at least 1-D.
>
> Ben Root
>
> P.S. - Taking this a step further, the functions completely fail in dealing
> with empty files...  In MATLAB, it returns an empty array (matrix?).
>

I am reviving this "dead" thread to note that I have filed ticket #1562 on
the numpy Trac about this issue: http://projects.scipy.org/numpy/ticket/1562

Ben Root
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20100727/55ae22cd/attachment.html>


More information about the NumPy-Discussion mailing list