如何使用由Julia中的PyCall导入的numpy.ma创建一个掩码数组

时间:2016-02-29 20:31:44

标签: python arrays numpy julia

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

is_masked()模块中numpy.ma帮助中的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蒙面数组?

1 个答案:

答案 0 :(得分:3)

我不认为您的翻译有任何问题 - 这看起来像是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}