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