--À propos des tranches et des masques de np.ndarray.
Comme vous le savez, ndarray peut être affecté à la plage spécifiée par slice.
slice.py
In [1]: import numpy as np
In [2]: table = np.zeros((2, 5))
In [3]: table[1, :3] = 1
In [4]: table
Out[4]:
array([[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 0., 0.]])
Cela est dû au fait que ndarray renvoie une référence au lieu d'une copie lorsqu'il est spécifié par tranche.
Vous pouvez également faire la même chose avec un masque booléen.
mask.py
In [1]: import numpy as np
In [2]: table = np.zeros((2, 5))
In [3]: table[1, [True, True, True, False, False]] = 1
In [4]: table
Out[4]:
array([[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 0., 0.]])
c'est le même.
Chaîne ça.
chain1.py
In [1]: import numpy as np
In [2]: table = np.zeros((2, 5))
In [3]: table[1, :3][1:] = 1
In [4]: table
Out[4]:
array([[ 0., 0., 0., 0., 0.],
[ 0., 1., 1., 0., 0.]])
Puisque la tranche renvoie une référence, la référence de la référence est une référence, il était donc possible de l'affecter en toute sécurité à la table d'origine. C'est facile. Maintenant, faisons de même pour les masques.
chain2.py
In [1]: import numpy as np
In [2]: table = np.zeros((2, 5))
In [3]: table[1, [True, True, True, False, False]][[False, True, True]] = 1
In [4]: table #Non attribué!!!!
Out[4]:
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
Eh bien, j'ai obtenu un résultat différent de ce à quoi je m'attendais.
chain3.py
In [1]: import numpy as np
In [2]: table = np.zeros((2, 5))
In [3]: table[1, [True, True, True, False, False]][1:] = 1
In [4]: table #Non attribué!!!!
Out[4]:
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
Il en va de même pour la chaîne masque + tranche.
Que voulez-vous dire ...
Il y a une explication détaillée dans la documentation officielle. http://scipy-cookbook.readthedocs.io/items/ViewsVsCopies.html
But fancy indexing does seem to return views sometimes, doesn't it? Si vous vérifiez la section de
sample1.py
>>> a = numpy.arange(10)
>>> a[[1,2]] = 100
>>> a
array([ 0, 100, 100, 3, 4, 5, 6, 7, 8, 9])
Quand
sample2.py
>>> a = numpy.arange(10)
>>> c1 = a[[1,2]]
>>> c1[:] = 100
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> c1
array([100, 100])
Explique la différence. Ce modèle est également cette fois.
En conclusion, Le masque (index fantaisie) n'a pas réellement renvoyé de vue.
Le masque a pu écraser l'objet d'origine non pas parce qu'il a renvoyé une vue, mais parce que l'interpréteur python le convertissait en une expression en place.
fancy_index1.py
>>> a[[1,2]] = 100
Est
fancy_index1_translated.py
a.__setitem__([1,2], 100)
Cela signifie que la valeur d'origine de a a changé car elle est convertie en. cependant,
fancy_index2.py
c1 = a[[1,2]]
Est
fancy_index2_translated.py
c1 = a.__getitem__([1,2])
Puisqu'il renvoie une copie au lieu d'une vue et d'une vue, le résultat changera au moment où il sera divisé en deux lignes.
En appliquant cela, les résultats de chain2.py et chain3.py peuvent également être expliqués.
table[1, [True, True, True, False, False]]
Renvoie une copie, donc peu importe combien vous l'écrasez après cela, la table d'origine ne sera pas modifiée.
chain4.py
In [1]: import numpy as np
In [2]: table = np.zeros((2, 5))
In [3]: table[1, :3][False, True, True] = 1
In [4]: table
Out[4]: ???
Quel est le résultat de ce retour ??
Recommended Posts