Open cstjean opened 6 years ago
I think array2py
needs to be rewritten based on cartesian indexing.
Why don't make the conversion lazy (unless the arrays is representable as a "native" numpy array)?
Here is my experiment on the "lazy" approach:
__getitem__
calls pygetindex
)pygetindex
is defined in Julia)The array interface __array_interface__
can also be implemented as a lazy property so that numpy.asarray
can use Julia function copy
internally (but only when necessary).
Ping here; this is also (I think) the same problem when passing a transpose:
ERROR: LoadError: MethodError: no method matching strides(::LinearAlgebra.Adjoint{Float64,Array{Float64,2}})
Closest candidates are:
strides(::SubArray) at subarray.jl:251
strides(::Base.CodeUnits) at strings/basic.jl:696
strides(::PermutedDimsArray{T,N,perm,iperm,AA} where AA<:AbstractArray where iperm) where {T, N, perm} at permuteddimsarray.jl:62
...
Stacktrace:
[1] stride(::LinearAlgebra.Adjoint{Float64,Array{Float64,2}}, ::Int64) at .\abstractarray.jl:342
[2] array2py(::LinearAlgebra.Adjoint{Float64,Array{Float64,2}}, ::Int64, ::Int64) at C:\Users\datseris\.julia\packages\PyCall\rUul9\src\conversions.jl:305
[3] array2py at C:\Users\datseris\.julia\packages\PyCall\rUul9\src\conversions.jl:325 [inlined]
[4] Type at C:\Users\datseris\.julia\packages\PyCall\rUul9\src\conversions.jl:327 [inlined]
[5] macro expansion at C:\Users\datseris\.julia\packages\PyCall\rUul9\src\exception.jl:84 [inlined]
[6] _pycall!(::PyCall.PyObject, ::PyCall.PyObject, ::Tuple{LinearAlgebra.Adjoint{Float64,Array{Float64,2}}}, ::Int64, ::PyCall.PyObject) at C:\Users\datseris\.julia\packages\PyCall\rUul9\src\pyfncall.jl:21
[7] _pycall!(::PyCall.PyObject, ::PyCall.PyObject, ::Tuple{LinearAlgebra.Adjoint{Float64,Array{Float64,2}}}, ::Base.Iterators.Pairs{Symbol,Any,NTuple{4,Symbol},NamedTuple{(:origin, :extent, :cmap, :aspect),Tuple{String,Array{Float64,1},String,String}}}) at C:\Users\datseris\.julia\packages\PyCall\rUul9\src\pyfncall.jl:11
[8] #pycall#88 at C:\Users\datseris\.julia\packages\PyCall\rUul9\src\pyfncall.jl:86 [inlined]
[9] #pycall at .\none:0 [inlined]
[10] #imshow#67(::Base.Iterators.Pairs{Symbol,Any,NTuple{4,Symbol},NamedTuple{(:origin, :extent, :cmap, :aspect),Tuple{String,Array{Float64,1},String,String}}}, ::Function, ::LinearAlgebra.Adjoint{Float64,Array{Float64,2}}) at C:\Users\datseris\.julia\packages\PyPlot\fZuOQ\src\PyPlot.jl:179
[11] (::getfield(PyPlot, Symbol("#kw##imshow")))(::NamedTuple{(:origin, :extent, :cmap, :aspect),Tuple{String,Array{Float64,1},String,String}}, ::typeof(imshow), ::LinearAlgebra.Adjoint{Float64,Array{Float64,2}}) at .\none:0
when trying to imshow
this: some_matrix'
This avoids the problem, by creating an additional copy of the data.
using PyCall: PyObject
PyObject(x::Adjoint) = PyObject(copy(x))
PyObject(x::Transpose) = PyObject(copy(x))
Can this be added to PyCall? It would also solve https://github.com/JuliaPy/PyPlot.jl/issues/380 .
On 0.7, I can pass a reshaped range to PyCall
On 1.0, it's
Is that a PyCall issue, or a base issue?