PythonCall.jl icon indicating copy to clipboard operation
PythonCall.jl copied to clipboard

Numpy v1 compatibility broken on main with `DimArray`

Open JamesWrigley opened this issue 3 weeks ago • 5 comments

Affects: PythonCall

Describe the bug ArrayValue.__array__() now supports the copy argument and defaults to copy=None, but this is not supported on numpy v1 and breaks when using a DimArray from DimensionalData.jl:

# Works
@pyeval (x=rand(10), np) => "np.asarray(x)"

# Fails
@pyeval (x=rand(X(10)), np) => "np.asarray(x)"
Python: ValueError: NoneType copy mode not allowed.
Python stacktrace:
 [1] __array__
   @ /path/to/julia-depot/packages/PythonCall/syXxf/src/JlWrap/array.jl:371
 [2] <module>
   @ In[44]:1:1

Not sure why it only breaks with DimArray but works with Array.

Your system Please provide detailed information about your system:

  • Linux
  • Julia 1.12.2, PythonCall main, Python 3.11.13, Numpy 1.26.4.

JamesWrigley avatar Nov 30 '25 00:11 JamesWrigley

Thanks. I think the fix is to call np.asarray instead of np.array when copy=None because np.array(x, copy=None) is not supported in numpy v1.

cjdoris avatar Dec 01 '25 11:12 cjdoris

Hmm, but that doesn't explain why it works with Array and not DimArray 🤔 I think something else is happening.

JamesWrigley avatar Dec 03 '25 08:12 JamesWrigley

My guess is that Base.unsafe_convert(::Type{Ptr{T}}, ::DimArray) is not defined, which is required to be wrappable as a python array, since this is how we get a pointer to the underlying data.

In this case we fall back to converting the array to an Array, and perhaps the above issue only arises in this branch?

cjdoris avatar Dec 06 '25 08:12 cjdoris

Is that a new requirement? Because it did work in the last stable release.

JamesWrigley avatar Dec 06 '25 10:12 JamesWrigley

No it's not new. Can you give an MWE showing it working and not working?

cjdoris avatar Dec 06 '25 10:12 cjdoris