如何使用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}
你能(HTTPS [在PyCall.jl打开一个问题了]:// github上。 COM/stevengj/PyCall.jl /问题/新)?这样你就可以自己跟踪进度。 –
非常感谢。我将在numpy.ma中打开一个关于masked array的问题! –