我有一些C ++代码已经存在python绑定,我正在尝试使用PyCall将其移植到Julia。被调用的函数之一生成一个指向内存中的2D数组的指针,我想将Julia数据包装在其中,以便我可以通过标量等来加/减,等等。我知道数组的大小,以及它目前表示为PyObject,我可以x_ptr[1]
,x_ptr[2]
并获取正确的值。但我想要一个数组x
。
答案 0 :(得分:1)
这是一个使用numpy的简单示例。默认情况下,PyCall将numpy数组转换为Julia的数组,但是我们可以使用@pycall
和::Any
注释来防止这种情况,以显示您是如何手动执行此操作的。你需要挖掘对象来找到那个指针。
julia> obj = @pycall numpy.reshape(numpy.arange(20), (4,5))::Any
PyObject array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
julia> array_interface = obj[:__array_interface__]
Dict{Any,Any} with 6 entries:
"shape" => (4, 5)
"strides" => nothing
"typestr" => "<i8"
"data" => (4705395216, false)
"descr" => Tuple{String,String}[("", "<i8")]
"version" => 3
julia> array_interface["data"] # This is the actual pointer!
(4705395216, false)
julia> unsafe_wrap(Matrix{Int}, Ptr{Int}(array_interface["data"][1]), reverse(array_interface["shape"]))
5×4 Array{Int64,2}:
0 5 10 15
1 6 11 16
2 7 12 17
3 8 13 18
4 9 14 19
当然,我不知道你的python对象如何存储它的指针。你必须深入挖掘你的Python对象才能自己找到它。