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

Single-index access to matrix results in confusing error

Open PhilReinhold opened this issue 2 years ago • 1 comments

Affects: JuliaCall

Describe the bug

from juliacall import Main as jl
z = jl.seval("[0 1; 2 3]")
z[0]

results in the stack trace

File ~/.julia/packages/PythonCall/wXfah/src/jlwrap/array.jl:310, in __getitem__(self, k)
    308     return bool(len(self))
    309 def __getitem__(self, k):
--> 310     return self._jl_callmethod($(pyjl_methodnum(pyjlarray_getitem)), k)
    311 def __setitem__(self, k, v):
    312     self._jl_callmethod($(pyjl_methodnum(pyjlarray_setitem)), k, v)

JuliaError: "an error occurred while setting an error"

I would expect z[0] to have the same output as list(z)[0]. The latter outputs just 0. Fair enough if you want to choose a different semantics though, since z[0,:] is another reasonable choice. Regardless, the error message is confusing as it stands.

Your system

  • macos 13.6
  • python 3.11.4
  • julia 1.9.4
  • juliacall 0.9.15 JuliaPkg Status /Users/pcrein/.pyenv/versions/3.11.4/envs/pyqsr-3.11.4/julia_env/pyjuliapkg/juliapkg.json (empty project) Julia 1.9.4 @ /Users/pcrein/.julia/juliaup/julia-1.9.4+0.aarch64.apple.darwin14/bin/julia

PhilReinhold avatar Dec 05 '23 17:12 PhilReinhold

The particular error message you're seeing is a bug. As it says, it tried to throw a different (better) error, but that failed for some reason so it threw this generic message instead. I can look into why.

However its correct that z[0] is disallowed for matrices - there is no standard convention for what that should mean (Julia and numpy return very different things) so this package defines neither.

You can wrap the array with numpy.asarray(z) if you'd like to use numpy's behaviour.

cjdoris avatar Dec 05 '23 22:12 cjdoris