[Numpy-discussion] Setting custom dtypes and 1.14
chris.barker at noaa.gov
Thu Jan 25 18:06:56 EST 2018
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',
In [*49*]: uv
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,
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.
Christopher Barker, Ph.D.
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 at noaa.gov
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the NumPy-Discussion