Apologies, it seems that I skipped to the end of @ahaldane's remark - we're on the same page.
On Fri, 26 Jan 2018 at 11:17 Eric Wieser <wieser.eric+nu...@gmail.com> wrote: > Why is the list of tuples a useful thing to have in the first place? If > the goal is to convert an array into a structured array, you can do that > far more efficiently with: > > def make_tup_dtype(arr): > """ > Attempt to make a type capable of viewing the last axis of an array, even > if it is non-contiguous. > Unfortunately `.view` doesn't allow us to use this dtype in that case, > which needs a patch... > """ > n_fields = arr.shape[-1] > step = arr.strides[-1] > descr = dict(names=[], formats=[], offsets=[], itemsize=step * n_fields) > for i in range(n_fields): > descr['names'].append('f{}'.format(i)) > descr['offsets'].append(step * i) > descr['formats'].append(arr.dtype) > return np.dtype(descr) > > Used as: > > >>> arr = np.arange(6).reshape(3, 2)>>> > >>> arr.view(make_tup_dtype(arr)).squeeze(axis=-1) > array([(0, 1), (2, 3), (4, 5)], > dtype=[('f0', '<i4'), ('f1', '<i4')]) > > Perhaps this should be provided by recfunctions (or maybe it already is, > in a less rigid form?) > > Eric > > > On Fri, 26 Jan 2018 at 10:48 Allan Haldane <allanhald...@gmail.com> wrote: > >> On 01/25/2018 08:53 PM, Chris Barker - NOAA Federal wrote: >> >> On Jan 25, 2018, at 4:06 PM, Allan Haldane <allanhald...@gmail.com> >> wrote: >> > >> >>> 1) This is a known change with good reason? >> > >> >> . The >> >> change occurred because the old assignment behavior was dangerous, and >> >> was not doing what you thought. >> > >> > OK, that’s a good reason! >> > >> >>> A) improve the error message. >> >> >> >> Good idea. I'll see if we can do it for 1.14.1. >> > >> > What do folks think about a totuple() method — even before this I’ve >> > wanted that. But in this case, it seems particularly useful. >> > >> > -CHB >> >> Two thoughts: >> >> 1. `totuple` makes most sense for 2d arrays. But what should it do for >> 1d or 3+d arrays? I suppose it could make the last dimension a tuple, so >> 1d arrays would give a list of tuples of size 1. >> >> 2. structured array's .tolist() already returns a list of tuples. If we >> have a 2d structured array, would it add one more layer of tuples? That >> would raise an exception if read back in by `np.array` with the same >> dtype. >> >> These points make me think that instead of a `.totuple` method, this >> might be more suitable as a new function in np.lib.recfunctions. If the >> goal is to help manipulate structured arrays, that submodule is >> appropriate since it already has other functions do manipulate fields in >> similar ways. What about calling it `pack_last_axis`? >> >> def pack_last_axis(arr, names=None): >> if arr.names: >> return arr >> names = names or ['f{}'.format(i) for i in range(arr.shape[-1])] >> return arr.view([(n, arr.dtype) for n in names]).squeeze(-1) >> >> Then you could do: >> >> >>> pack_last_axis(uv).tolist() >> >> to get a list of tuples. >> >> Allan >> _______________________________________________ >> NumPy-Discussion mailing list >> NumPy-Discussion@python.org >> https://mail.python.org/mailman/listinfo/numpy-discussion >> >
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion