重新解读Juli中的指针

2024-10-03 13:29:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些C++代码,它有现有的Python绑定,我想用pyLeCK移植到朱丽亚上。其中一个被调用的函数生成了一个指向内存中的2D数组的指针,我想把Julia数组包围起来,这样我就可以用标量加/减/乘等等。我知道数组的大小,它当前被表示为一个PyObject,我可以对它执行x_ptr[1]x_ptr[2]并获得正确的值。但是我想要一个数组,x。在


Tags: 函数内存代码数组指向pyobject标量指针
1条回答
网友
1楼 · 发布于 2024-10-03 13:29:59

下面是一个使用numpy的简单示例。默认情况下,PyCall会将numpy数组转换为Julia的数组,但是我们可以通过@pycall和{}注释来防止这种情况的发生,以显示您如何手动执行该操作。你需要深入研究这个对象才能找到那个指针。在

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对象才能找到该指针。在

相关问题 更多 >