
Hello, Ilhan, From: NumPy-Discussion <numpy-discussion-bounces+einstein.edison=gmail.com@python.org> on behalf of Ilhan Polat <ilhanpolat@gmail.com> Reply to: Discussion of Numerical Python <numpy-discussion@python.org> Date: Thursday, 27. February 2020 at 08:41 To: Discussion of Numerical Python <numpy-discussion@python.org> Subject: Re: [Numpy-discussion] Output type of round is inconsistent with python built-in Oh sorry. That's trigger finger np-dotting. What i mean is if someone was using the round method on float32 or other small bit datatypes they would have a silent upcasting. No they won’t. The only affected types would be scalars, and that too only with the built-in Python round. Arrays don’t define the __round__ method, and so won’t be affected. np.ndarray.round won’t be affected either. Only np_scalar_types.__round__ will be affected, which is what the Python round checks for. For illustration, in code:
type(round(np_float)) <class 'numpy.float64'> type(round(np_array_0d)) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: type numpy.ndarray doesn't define __round__ method type(round(np_array_nd)) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: type numpy.ndarray doesn't define __round__ method
The second and third cases would remain unaffected. Only the first case would return a builtin Python int with what Robert Kern is suggesting and a np.int64 with what I’m suggesting. I do agree with something posted elsewhere on this thread that we should warn on overflow but prefer to be self-consistent and return a np.int64, but it doesn’t matter too much to me. Furthermore, the behavior of np.[a]round and np_arr.round(…) will not change. The only upcasting problem here is if someone does this in a loop, in which case they’re probably using Python objects and don’t care about memory anyway. Maybe not a big problem but can have significant impact. Best regards, Hameer Abbasi