[NumPy-Tickets] [NumPy] #1619: Loading aligned dtype error
NumPy Trac
numpy-tickets@scipy....
Tue Dec 28 18:04:10 CST 2010
#1619: Loading aligned dtype error
-----------------------------+----------------------------------------------
Reporter: Ihor.Melnyk | Owner: somebody
Type: defect | Status: needs_review
Priority: highest | Milestone: 2.0.0
Component: numpy.core | Version: devel
Keywords: dtype alignment |
-----------------------------+----------------------------------------------
Changes (by jpeel):
* status: new => needs_review
Comment:
I've come up with a possible solution, but first let me explain the real
problem here.
The real problem here is that dtype() can't handle a list that describes
an aligned dtype. For instance, in the example given above, the list that
is put into dtype() when the file is loaded is
{{{[('f0', '|i1'), ('', '|V3'), ('f1', '<i4'), ('f2', '|i1')]}}}
on my machine. {{{('', '|V3')}}} indicates that this is an aligned dtype.
The first element in each tuple is the name of the field. When dtype finds
a name equal to {{{''}}}, it currently sets the name of that field to
{{{'f#ind'}}} where #ind is the index of the tuple in the list. That means
that {{{('', '|V3')}}} in the above list has its name set to {{{'f1'}}}
which then causes an error when the next item has a name of {{{'f1'}}}.
Okay, so the problem then is that dtype() currently doesn't know how to
read in an aligned type correctly. Here is how I approached solving this.
1. If the align parameter doesn't equal 1 and the name of the first tuple
is not equal to {{{''}}}, then set checkalign to 1 so that this input list
could indicate an aligned array.
2. If checkalign, then trigger that a tuple deals with alignment when:
a. a tuple's name is {{{''}}}
b. a tuple's title is NULL
c. a tuple has only two elements
d. the datatype of the tuple is VOID
3. When we find a tuple that meets all of the above conditions,
a. add the size of the VOID tuple to the totalsize
b. set maxalign to MAX(maxalign, current element size + previous
element size)
c. adjust the name index accordingly
4. Make sure that the alignment is set correctly when checkalign==1.
5. Readjust the size of the nameslist tuple if necessary. (if there were
any aligning tuples, then nameslist initialized to be too large).
3.c. refers to an additional index, ii, to keep track of the indices in
the nameslist. This is necessary because i refers to the index in the
input list.
There might be a better approach than this, but this is one possible
solution. Other approaches might involve changing the npy format or how
aligned dtypes are shown. However, I think that those will be much harder
to implement.
In the patch that I'm attaching, I've kept everything in the
_convert_from_array_desc function, but it might be a good idea to break it
up a bit or make some other changes to make the code more manageable.
--
Ticket URL: <http://projects.scipy.org/numpy/ticket/1619#comment:1>
NumPy <http://projects.scipy.org/numpy>
My example project
More information about the NumPy-Tickets
mailing list