Hi all,

I'm pretty sure this is the same thing as recently discussed on this list about 1.14, but to confirm:

I had failures in my code with an upgrade for 1.14 -- turns out it was a single line in a single test fixture, so no big deal, but a regression just the same, with no deprecation warning.

I was essentially doing this:

In [48]: dt

Out[48]: dtype([('time', '<i8'), ('value', [('u', '<f8'), ('v', '<f8')])], align=True)


In [49]: uv

Out[49]: 

array([[1., 1.],

       [1., 1.],

       [1., 1.],

       [1., 1.]])


In [50]: time

Out[50]: array([1, 1, 1, 1])


In [51]: full = np.array(zip(time, uv), dtype=dt)

---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-51-ed726f71dd4a> in <module>()

----> 1 full = np.array(zip(time, uv), dtype=dt)


ValueError: setting an array element with a sequence.



It took some poking, but the solution was to do:

full = np.array(zip(time, (tuple(w) for w in uv)), dtype=dt)


That is, convert the values to nested tuples, rather than an array in a tuple, or a list in a tuple.

As I said, my problem is solved, but to confirm:

1) This is a known change with good reason?

2) My solution was the best (only) one -- the only way to set a nested dtype like that is with tuples?

If so, then I think we should:

A) improve the error message.

"ValueError: setting an array element with a sequence."

Is not really clear -- I spent a while trying to figure out how I could set a nested dtype like that without a sequence? and I was actually using a ndarray, so it wasn't even a generic sequence. And a tuple is a sequence, too...

I had a vague recollection that in some circumstances, numpy treats tuples and lists (and arrays) differently (fancy indexing??), so I tried the tuple thing and that worked. But I've been around numpy a long time -- that could have been very very confusing to many people.

So could the message be changed to something like:

"ValueError: setting an array element with a generic sequence. Only the tuple type can be used in this context."

or something like that -- I'm not sure where else this same error message might pop up, so that could be totally inappropriate.


2) maybe add a .totuple()method to ndarray, much like the .tolist() method? that would have been handy here.


-Chris


--

Christopher Barker, Ph.D.
Oceanographer

Emergency Response Division
NOAA/NOS/OR&R            (206) 526-6959   voice
7600 Sand Point Way NE   (206) 526-6329   fax
Seattle, WA  98115       (206) 526-6317   main reception

Chris.Barker@noaa.gov