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

问题描述:

我想使用PyCall在Julia中导入的numpy.ma创建一个掩码数组。如何使用PyCall在Julia中导入的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 

在这种情况下,蟒对象可以直接毫不费力创建。

问题:我的翻译出了什么问题?我如何在Julia中创建一个numpy的蒙面数组?

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

你能(HTTPS [在PyCall.jl打开一个问题了]:// github上。 COM/stevengj/PyCall.jl /问题/新)?这样你就可以自己跟踪进度。 –

+0

非常感谢。我将在numpy.ma中打开一个关于masked array的问题! –