我想在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}