[Numpy-discussion] Fwd: Named dtype array: Difference between a['name'] and a['name']?
jsseabold at gmail.com
Mon May 21 16:53:05 EDT 2012
On Mon, May 21, 2012 at 4:37 PM, Travis Oliphant <travis at continuum.io> wrote:
> This is the right place to ask, it's just that it can take time to get an
> answer because people who might know the answer may not have the time to
> respond immediately.
> The short answer is that this is not really a "normal" bug, but it could be
> considered a "design" bug (although the issues may not be straightforward to
> resolve). What that means is that it may not be changed in the short term
> --- and you should just use the first spelling.
> Structured arrays can be a confusing area of NumPy for several of reasons.
> You've constructed an example that touches on several of them. You have a
> data-type that is a "structure" array with one member ("tuple"). That
> member contains a 2-vector of integers.
> First of all, it is important to remember that with Python, doing
> a['tuple'] = (1,2) is equivalent to b = a['tuple']; b = (1,2). In
> like manner, a['tuple'] = (1,2) is equivalent to b = a; b['tuple'] =
> To understand the behavior, we need to dissect both code paths and what
> happens. You built a (3,) array of those elements in 'a'. When you write
> b = a['tuple'] you should probably be getting a (3,) array of (2,)-integers,
> but as there is currently no formal dtype support for (n,)-integers as a
> general dtype in NumPy, you get back a (3,2) array of integers which is the
> closest thing that NumPy can give you. Setting the  row of this object
> a['tuple'] = (1,2)
> works just fine and does what you would expect.
> On the other hand, when you type:
> b = a
> you are getting back an array-scalar which is a particularly interesting
> kind of array scalar that can hold records. This new object is formally
> of type numpy.void and it holds a "scalar representation" of anything that
> fits under the "VOID" basic dtype.
> For some reason:
> b['tuple'] = [1,2]
> is not working. On my system I'm getting a different error: TypeError:
> object of type 'int' has no len()
> I think this should be filed as a bug on the issue tracker which is for the
> time being here: http://projects.scipy.org/numpy
> The problem is ultimately the void->copyswap function being called in
> voidtype_setfields if someone wants to investigate. I think this behavior
> should work.
Just playing around I found this to be odd, though I guess makes some
sense given your comments
: b['tuple'] = [(1,2)]
: ([1, 0],)
array([([1, 0],), ([0, 0],), ([0, 0],)],
dtype=[('tuple', '<i8', (2,))])
More information about the NumPy-Discussion