[Numpy-discussion] Fwd: Named dtype array: Difference between a[0]['name'] and a['name'][0]?

Skipper Seabold 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'][0] = (1,2) is equivalent to b = a['tuple']; b[0] = (1,2).   In
> like manner, a[0]['tuple'] = (1,2) is equivalent to b = a[0]; b['tuple'] =
> (1,2).
>
> 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 [0] row of this object
> via
>
> a['tuple'][0] = (1,2)
>
> works just fine and does what you would expect.
>
> On the other hand, when you type:
>
> b = a[0]
>
> 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

[~/]
[12]: b['tuple'] = [(1,2)]

[~/]
[13]: b
[13]: ([1, 0],)

[~/]
[14]: a
[14]:
array([([1, 0],), ([0, 0],), ([0, 0],)],
      dtype=[('tuple', '<i8', (2,))])

[~/]
[15]: b[0].dtype
[15]: dtype('int64')

[~/]
[16]: np.version.full_version
[16]: '1.6.1'

Skipper



More information about the NumPy-Discussion mailing list