On Fri, 2023-03-17 at 07:44 +0000, Ralf Gommers wrote:
> On Thu, Mar 16, 2023 at 7:57 PM Sergio Callegari <
> sergio.calleg...@gmail.com>
> wrote:
> 
> > I am trying to use the `clip` method to transform floats to
> > integers with
> > clipping. I was expecting to be able to do both the clipping and
> > the type
> > conversion at once, passing the `dtype` parameter to `clip`,
> > together with
> > a suitable `casting` param. Such expectation came from reading the
> > documentation of the `dtype` param for u-funcs that states that
> > this
> > parameter "Overrides the DType of the output arrays".
> > Unfortunately, using
> > the `dtype` parameter with `clip` causes the type conversion to be
> > practiced before the clipping, not after it.  Is this how it is
> > expected to
> > operate?
> > 
> 
> Yes, that's how it is working. The docs (and design) are indeed
> confusing -
> the `dtype` keyword doesn't quite do what you'd expect here. It
> selects the
> internal loops for the specified dtype, rather than only changing the
> output dtype. So you get this kind of weirdness:
> 
> > > > x = np.array([1, 5, 259], dtype=np.uint16)
> > > > np.clip(x, 3, 200, dtype=np.uint8)
> array([3, 5, 3], dtype=uint8)
> > > > np.clip(x, 3, 200).astype(np.uint8)
> array([  3,   5, 200], dtype=uint8)
> 
> I don't think the behavior can be changed. The docs already hint at
> what is
> happening: "The exact calculation DTypes chosen may depend on the
> ufunc and
> the inputs may be cast to this DType to perform the calculation."


Maybe it is helpful to you that using `out=`:

    x = np.array([1, 5, 259], dtype=np.uint16)
    res = np.empty_like(x, np.uint8)
    np.clip(x, 3, 200, out=res, casting="unsafe")

will perform the calculation in whatever the inputs are and _then_
cast.  But, in NumPy, unless you have largish arrays, performing the
cast afterwards is likely faster either way (full disclosure: I didn't
try so not 100% sure, also I guess things could improve over time).

- Sebastian


> 
> Cheers,
> Ralf
> _______________________________________________
> NumPy-Discussion mailing list -- numpy-discussion@python.org
> To unsubscribe send an email to numpy-discussion-le...@python.org
> https://mail.python.org/mailman3/lists/numpy-discussion.python.org/
> Member address: sebast...@sipsolutions.net


_______________________________________________
NumPy-Discussion mailing list -- numpy-discussion@python.org
To unsubscribe send an email to numpy-discussion-le...@python.org
https://mail.python.org/mailman3/lists/numpy-discussion.python.org/
Member address: arch...@mail-archive.com

Reply via email to