我想使用由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蒙面数组?
答案 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}