2016-02-29 2 views
4

Я хочу создать массив с маской с использованием numpy.ma, импортированный PyCall в Julia.Как создать маскированный массив, используя numpy.ma, импортированный PyCall в Julia

Пример Python в помощь is_masked() в numpy.ma модуль.

>>> 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> 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 можно создавать непосредственно без усилий.

Вопрос: Что случилось с моим переводом? Как я могу создать массив с маской в ​​numpy в Julia?

ответ

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} 
+0

Не могли бы вы [открыть вопрос более в PyCall.jl] (https: // GitHub. ком/stevengj/PyCall.jl/вопросы/новые)? Таким образом, вы сможете отслеживать свой прогресс самостоятельно. –

+0

Большое спасибо. Я открою вопрос о маскированном массиве в numpy.ma! –

Смежные вопросы