在Julia中使用PyCall.jl时修改Python对象的属性

我正在尝试通过PyCall.jl与python库进行交互,其中该库返回一个具有我想在Julia中修改的属性的python对象(Julia中的PyObject)。例如说我有以下虚拟python类,

import numpy as np

class MyNumpy:
     def __init__(self,n,m):
          self.array = np.zeros((n,m))
          self.size = (n,m)

现在在Julia中,我使用PyCall.jl加载此python类并实例化,类似于:

using PyCall

mynumpy = pyimport("MyNumpy.MyNumpy")
pyobject = mynumpy(3,3)
...

> pyobject.array
> 3×3 Array{Float64,2}:
  0.0  0.0  0.0
  0.0  0.0  0.0
  0.0  0.0  0.0
...

pyobject.array[1,1] = 1.0 

> pyobject.array
> 3×3 Array{Float64,2}:
  0.0  0.0  0.0
  0.0  0.0  0.0
  0.0  0.0  0.0

执行的最后一行代码没有任何错误,但是在调查pyobject.array[1,1]时,该值没有改变(即保持0.0)。

例如,如何在Julia中更改Pycall.jl PyObject属性值,如果可以的话,我可以使用指针吗?很抱歉,如果这很明显,但是我没有运气不好,无法使用PyCall.jl文档找出解决方法。预先感谢。

P.S。实际的python库不是很容易修改的东西。

nishiwoderena222 回答:在Julia中使用PyCall.jl时修改Python对象的属性

PyCall默认将对象适当地转换为Julia类型。在这种情况下,当您访问array类的MyNumpy字段时就会发生这种情况:它返回一个numpy数组,PyCall会将其转换为边界处的朱利安语Array。如果您想退出该自动转换,则可以使用uglier,dot-access with a string

julia> py"""
       import numpy as np

       class MyNumpy:
            def __init__(self,n,m):
                 self.array = np.zeros((n,m))
                 self.size = (n,m)
       """

julia> mynumpy = py"MyNumpy"
PyObject <class '__main__.MyNumpy'>

julia> pyobject = mynumpy(3,3)
PyObject <__main__.MyNumpy object at 0x1383398d0>

julia> pyobject.array # converted (copied!) into a Julian Array
3×3 Array{Float64,2}:
 0.0  0.0  0.0
 0.0  0.0  0.0
 0.0  0.0  0.0

julia> pyobject."array" # This is the "raw" numpy array!
PyObject array([[0.,0.,0.],[0.,0.]])

现在,您可以在Python的list-of-lists表示形式内工作,但这很烦人。该API并不是最好的API,您必须记住基于0的行主要实现。 PyCall有一个很好的便捷助手,它通过朱利安AbstractArray将数组作为共享内存公开:

julia> array = PyArray(pyobject."array")
3×3 PyArray{Float64,2}:
 0.0  0.0  0.0
 0.0  0.0  0.0
 0.0  0.0  0.0

julia> array[1,1] = 1.0
1.0

julia> array
3×3 PyArray{Float64,2}:
 1.0  0.0  0.0
 0.0  0.0  0.0
 0.0  0.0  0.0

julia> pyobject.array # remember,this is a copy
3×3 Array{Float64,2}:
 1.0  0.0  0.0
 0.0  0.0  0.0
 0.0  0.0  0.0
本文链接:https://www.f2er.com/3164841.html

大家都在问