我想在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蒙面数组?

最佳答案

我不认为你的翻译有什么问题-这看起来像是pycall中的一个bug。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}

08-20 02:32