Numpy: np.copy (matriz mascarada) tem um comportamento inesperado

Criado em 26 jun. 2013  ·  11Comentários  ·  Fonte: numpy/numpy

.... onde "inesperado" significa _Eu_ não esperava. Isso pode ser apenas uma correção de documentação, ou talvez eu seja repreendido por não perceber como np.ma funciona, mas não acho que esse comportamento seja apropriado:

In [100]: x = np.ma.ones(5)

In [101]: x.mask = [False,False,True,False,False]

In [102]: np.copy(x)
Out[102]: array([ 1.,  1.,  1.,  1.,  1.])

In [103]: np.ma.copy(x)
Out[103]:
masked_array(data = [1.0 1.0 -- 1.0 1.0],
             mask = [False False  True False False],
       fill_value = 1e+20)

In [104]: np.__version__
Out[104]: '1.8.0.dev-074a40c'

Eu esperaria pelo menos um aviso, mas preferiria ver, em ordem de preferência:

  • np.copy(x) retorna uma matriz mascarada (já que x é uma matriz mascarada)
  • np.copy(x) avisa que está desmascarando a matriz e, em seguida, retorna a mesma matriz acima
  • np.copy(x) levanta uma exceção
  • np.copy(x) retorna [1,1,nan,1,1] (provavelmente não é o ideal)
00 - Bug numpy.lib

Todos 11 comentários

Ainda aberto em 1.9-devel

No entanto, não tenho certeza de como consertar isso sem matrizes especiais mascaradas.

Mudar a lógica de np.copy para incluir subok=True na chamada para o array resolveria esse problema?
De:

return array(a, order=order, copy=True)

Para:

return array(a, order=order, subok=True, copy=True)

Em caso afirmativo, subok deve ser um parâmetro para np.copy e qual deve ser o padrão, Verdadeiro ou Falso? True retornará o primeiro resultado preferido, False manterá o comportamento atual, mas permitirá o comportamento esperado, mas adicionando um argumento.

Não sou a favor de adicionar um parâmetro subok a np.copy quando já temos duas soluções completamente viáveis:

  • use o método .copy()
  • use np.array(a, subok=True) (copia por padrão)

Na verdade, eu argumentaria o contrário, já que acho que a maioria das "cópias" dá a impressão de que se obteria algo de volta que é, na verdade, uma cópia e, portanto, do mesmo tipo. Também vejo isso como uma contribuição pequena, mas útil, para tornar o todo numpy mais consistentemente capaz de lidar com subclasses (assim como fiz anteriormente com np.broadcast_arrays , onde nenhum bom substituto estava disponível). No entanto, dada a necessidade de permanecer compatível com as versões anteriores, acho que estamos presos a um padrão de subok=False .

De qualquer forma, @jjhelmus , por que não fazer um RP rápido e ver o que os outros pensam?

@shoyer : np.copy provavelmente deve entrar em sua lista de funções que precisam
algum tipo de suporte de array de pato - para um array de pato, acho que np.copy
e np.array provavelmente deve fazer coisas diferentes. Talvez devesse apenas ligar
arr.copy?

Na quinta-feira, 15 de outubro de 2015 às 7h, Marten van Kerkwijk <
notificaçõ[email protected]> escreveu:

Na verdade, eu argumentaria o contrário, pois acho que a maioria das "cópias" dá
a impressão de que se obteria algo que é, na verdade, uma cópia,
e, portanto, do mesmo tipo. Também vejo isso como uma contribuição pequena, mas útil
para tornar todo o numpy mais consistentemente capaz de lidar com as subclasses
(assim como fiz anteriormente com np.broadcast_arrays, onde nenhum bom substituto
estava disponível). No entanto, dada a necessidade de permanecer compatível com as versões anteriores, eu
acho que estamos presos a um padrão de subok = False.

Enfim, @jjhelmus https://github.com/jjhelmus , por que não fazer uma RP rápida
e ver o que os outros pensam?

-
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/numpy/numpy/issues/3474#issuecomment -148395201.

Nathaniel J. Smith - http://vorpus.org

Sim, eu seria +1 em fazer np.copy tentar chamar o método de cópia em matrizes de pato.

Ainda não há razão para não apoiar subok também. E, claro, pode-se simplesmente chamar __copy__ se ele existir.

Criado PR # 6509 que adiciona um parâmetro subok à função com um valor padrão de False . Suponho que isso abrirá alguma discussão sobre o assunto. Não tenho certeza se isso normalmente ocorre no PR, na edição ou na lista de mala direta.

A discussão da API deve estar na lista de discussão.
Em 18 de outubro de 2015, 19h37, "Jonathan J. Helmus" [email protected]
escrevi:

PR # 6509 criado https://github.com/numpy/numpy/pull/6509 que adiciona um
parâmetro _subok_ para a função com um valor padrão de _False_. Eu estou
adivinhar isso abrirá alguma discussão sobre o tópico. Não tenho certeza se isso
normalmente ocorre no PR, na edição ou na lista de mala direta.

-
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/numpy/numpy/issues/3474#issuecomment -149080511.

Mandarei um e-mail para a lista sobre o assunto amanhã.

Esta página foi útil?
0 / 5 - 0 avaliações