Numpy: np.copy (tableau masqué) a un comportement inattendu

Créé le 26 juin 2013  ·  11Commentaires  ·  Source: numpy/numpy

.... où "inattendu" signifie _Je_ ne m'y attendais pas. Cela peut simplement être un correctif de la documentation, ou peut-être que je serai réprimandé pour ne pas avoir réalisé comment fonctionne np.ma , mais je ne pense pas que ce comportement soit approprié:

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'

Je m'attendrais au moins à un avertissement, mais préférerais voir, par ordre de préférence:

  • np.copy(x) renvoie un tableau masqué (puisque x est un tableau masqué)
  • np.copy(x) avertit qu'il démasque le tableau, puis renvoie le même tableau que ci-dessus
  • np.copy(x) lève une exception
  • np.copy(x) renvoie [1,1,nan,1,1] (ce n'est probablement pas idéal)
00 - Bug numpy.lib

Tous les 11 commentaires

Toujours ouvert dans 1.9-devel

Je ne sais pas comment résoudre ce problème sans les tableaux masqués spéciaux, cependant.

Le fait de changer la logique de np.copy pour inclure subok=True dans l'appel au tableau résoudrait-il ce problème?
De:

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

À:

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

Si tel est le cas, subok devrait-il être un paramètre de np.copy et quelle devrait être la valeur par défaut, True ou False? True renverra le premier résultat préféré, False conservera le comportement actuel, mais autorisera le comportement attendu mais en ajoutant un argument.

Je ne suis pas favorable à l'ajout d'un paramètre subok à np.copy alors que nous avons déjà deux solutions complètement viables:

  • utilisez la méthode .copy()
  • use np.array(a, subok=True) (il copie par défaut)

Je dirais en fait le contraire, car je pense que la plupart des "copies" donnent l'impression que l'on récupérerait quelque chose qui est, en fait, une copie, et donc du même type. Je le vois aussi comme une petite mais utile contribution pour rendre l'ensemble de numpy plus cohérent capable de traiter les sous-classes (tout comme je l'ai fait plus tôt avec np.broadcast_arrays , où aucun bon substitut n'était disponible). Cependant, étant donné la nécessité de rester rétrocompatible, je pense que nous sommes coincés avec une valeur par défaut de subok=False .

Quoi qu'il en soit, @jjhelmus , pourquoi ne pas faire un PR rapide et voir ce que les autres en pensent?

@shoyer : np.copy devrait probablement figurer sur votre liste de fonctions nécessitant
une sorte de support de tableau de canard, cependant - pour un tableau de canard, je pense que np.copy
et np.array devrait probablement faire des choses différentes. Peut-être que ça devrait juste appeler
arr.copy?

Le jeu.15 octobre 2015 à 07:00, Marten van Kerkwijk <
[email protected]> a écrit:

Je dirais en fait le contraire, car je pense que la plupart des "copies" donnent
l'impression que l'on récupérerait quelque chose qui est, en fait, une copie,
et donc du même type. Je le vois aussi comme une petite mais utile contribution
pour rendre l'ensemble de numpy plus cohérent pour traiter les sous-classes
(tout comme je l'ai fait plus tôt avec np.broadcast_arrays, où aucun bon substitut
était disponible). Cependant, étant donné la nécessité de rester rétrocompatible, je
Je pense que nous sommes coincés avec une valeur par défaut de subok = False.

Quoi qu'il en soit, @jjhelmus https://github.com/jjhelmus , pourquoi ne pas faire un PR rapide
et voir ce que les autres pensent?

-
Répondez directement à cet e-mail ou affichez-le sur GitHub
https://github.com/numpy/numpy/issues/3474#issuecomment -148395201.

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

Oui, je serais +1 en faisant np.copy, essayez d'appeler la méthode de copie sur les tableaux de canard.

Toujours aucune raison de ne pas prendre en charge subok également. Et bien sûr, on peut simplement appeler __copy__ s'il existe.

Créé le PR # 6509 qui ajoute un paramètre subok à la fonction avec une valeur par défaut False . J'imagine que cela ouvrira une discussion sur le sujet. Je ne sais pas si cela se produit généralement sur le PR, le problème ou la liste de diffusion.

La discussion sur l'API doit figurer sur la liste de diffusion.
Le 18 octobre 2015 à 19h37, "Jonathan J. Helmus" [email protected]
a écrit:

Créé le PR # 6509 https://github.com/numpy/numpy/pull/6509 qui ajoute un
paramètre _subok_ à la fonction avec une valeur par défaut de _False_. je suis
deviner cela ouvrira une discussion sur le sujet. Je ne sais pas si cela
a généralement lieu sur le PR, le numéro ou la liste de diffusion.

-
Répondez directement à cet e-mail ou affichez-le sur GitHub
https://github.com/numpy/numpy/issues/3474#issuecomment -149080511.

J'enverrai un email à la liste sur le sujet demain.

Cette page vous a été utile?
0 / 5 - 0 notes