【问题标题】:How to create a masked array using numpy.ma imported by PyCall in Julia如何在 Julia 中使用 PyCall 导入的 numpy.ma 创建掩码数组
【发布时间】:2016-02-29 20:31:44
【问题描述】:

我想使用由 Julia 中的 PyCall 导入的 numpy.ma 创建一个屏蔽数组。

numpy.ma 模块中is_masked() 帮助下的 Python 示例。

>>> import numpy.ma as ma
>>> x = ma.masked_equal([0, 1, 0, 2, 3], 0)
>>> x
masked_array(data = [-- 1 -- 2 3],
      mask = [ True False  True False False],
      fill_value=999999)
>>> ma.is_masked(x)
True

我尝试使用 PyCall 将其翻译成 Julia。

julia> using PyCall
julia> @pyimport numpy.ma as ma
julia> x = ma.masked_equal([0, 1, 0, 2, 3], 0);
julia> x
5-element Array{Int64,1}:
 0
 1
 0
 2
 3
julia> ma.is_masked(x)
false

上面的代码不工作。它无法创建 Python 对象。它只是创建了一个普通的 Julia 数组。我尝试了其他方法,例如ma.array([1, 2, 3], mask=[0, 0, 1]),但仍然无法正常工作。

但是,从https://github.com/stevengj/PyCall.jl 中的示例来看,

julia> @pyimport Bio.Seq as s
julia> @pyimport Bio.Alphabet as a
julia> my_dna = s.Seq("AGTACACTGGT", a.generic_dna)
PyObject Seq('AGTACACTGGT', DNAAlphabet())
julia> my_dna[:find]("ACT")
5

在这种情况下,python对象可以直接创建,不费吹灰之力。

问题:我的翻译有什么问题?如何在 Julia 中创建一个 numpy 掩码数组?

【问题讨论】:

    标签: python arrays numpy julia


    【解决方案1】:

    我不认为你的翻译有什么问题——这看起来像是 PyCall 中的一个错误。 PyCall 尝试来回映射 Julia 和 Python 类型,以便您可以无缝地使用 Julia 的数组,如 NumPy 数组(例如)。在这种情况下,看起来它在进行转换时有点过分热情。

    您可以直接使用pycall 禁用转换。第二个参数是返回类型:

    julia> x = pycall(ma.masked_equal, Any, [0,1,0,2,3], 0)
    PyObject masked_array(data = [-- 1L -- 2L 3L],
                 mask = [ True False  True False False],
           fill_value = 0)
    
    julia> ma.is_masked(x)
    true
    

    这是python类型识别中的一个错误。 PyCall 认为 masked_array 对象类型应该映射到一个内置数组,所以这就是它默认返回一个数组的原因:

    julia> pytype_query(x)
    Array{Int64,N}
    

    【讨论】:

    • 你能open an issue over at PyCall.jl吗?这样您就可以自己跟踪其进度。
    • 非常感谢。我将在 numpy.ma 中打开一个关于掩码数组的问题!
    猜你喜欢
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    相关资源
    最近更新 更多