On Fri, Mar 29, 2024 at 8:07 AM Steven G. Johnson <stev...@mit.edu> wrote:

> Should a dtype=object array be treated more like Python lists for type
> detection/coercion reasons?   Currently, they are treated quite differently:
> >>> np.isfinite([1,2,3])
> array([ True,  True,  True])
>

In this case, the `[1, 2, 3]` is being converted into an array of integers
before it is acted upon by `np.isfinite`. The function needs an array and
the list-to-array coercion selects a reasonably narrow dtype based on the
values in the list. In principle, the dtype of the list of Python `int`
values could be `object`, `np.int64`, `np.int32`, or maybe even a floating
point type (because integers are a subset of the reals), but `np.int64` is
reasonable. (Although on Windows, the choice is `np.int32`!)

When the `np.isfinite` function is given an array, which already has a
specified dtype, it takes that dtype seriously and doesn't try to change
it. So, given `np.array([1, 2, 3], dtype=object)`, no coercion is
attempted, and `np.isfinite` can't operate on arrays with that dtype.

The difference with respect to Julia is that types are more of a focal
point of user attention than in Python. NumPy array types are a focal point
of user attention, but Python types are less so. `Any[]` is a good analogue
of NumPy arrays with `dtype=object` in the sense that functions don't try
to downcast them to the narrowest type supported by their values, but there
isn't a good Julia analogue of a Python list, which is fair game for such
downcasting. A Python user, like me, *wants* NumPy to figure out that if I
pass `[1, 2, 3]` to a function that needs an array, it should cast it as an
array of integers—at least when I'm in the hacking stage of developing a
project or interactively trying things out in a terminal or Jupyter. Later,
to have more control over a project that's getting more mature, I'll be
explicit about types and explicitly cast them as NumPy arrays with
specified dtypes. (For example, to ensure that integer types have the same
bit width on all platforms.) Since Julia uses types to determine which
implementation of a function to run, Julia can't be this loose about types
at any stage of development: invoking a different method-overload of a
function is not a small, gradual change.

For the interface between Python and Julia, then, there are going to be
some hard decisions to make. Not every type on one side has a good
equivalent on the other. Personally, I would consider it reasonable for all
Julia AbstractArrays to transfer to Python as NumPy arrays—none of them as
Python lists. The transformation can't be bijective because Python lists
would transfer to Julia as `Any[]`. Users of both languages would have to
be aware that the conversion doesn't round-trip.

-- Jim
_______________________________________________
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