[PYTHON] À propos de l'attribution de numpy.ndarray

Notez que j'étais accro à l'attribution de numpy.ndarray

Si vous écrivez en trois lignes

--À propos des tranches et des masques de np.ndarray.

Tranches et masques 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.

Point addictif: tranche ndarray et chaîne de masques

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 ...

Cause et description

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.

Enfin le problème

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

À propos de l'attribution de numpy.ndarray
À propos de tout numpy
À propos de MultiIndex of Pandas
À propos de la variable du chainer
À propos de l'attribution cumulative de la liste et du tableau numpy
À propos de max_iter de LogisticRegression () de scikit-learn
À propos du chemin japonais de pyminizip
À propos du support japonais de cometchat
À propos de divers encodages de Python 3
À propos de tout numpy (2e)
À propos du calcul des coûts de MeCab
À propos de la fraction approximative du rapport de circonférence
À propos des composants de Luigi
À propos de la sortie HOG de Scikit-Image
À propos des fonctionnalités de Python
À propos de la gestion des données d'Anvil-App-Server
À propos de la valeur de retour de pthread_mutex_init ()
À propos de la valeur de retour de l'histogramme.
À propos du type de base de Go
À propos de la limite supérieure de threads-max
À propos du croisement circulaire d'algorithmes génétiques
À propos du comportement de yield_per de SqlAlchemy
À propos de l'erreur d'importation de PyQt5.QtWidgets (Anaconda)
À propos de la taille des points dans matplotlib
À propos du traitement des demi-teintes couleur des images
À propos de la liste de base des bases de Python
À propos de la création de l'interface graphique à l'aide de TKinter de Python
A propos du comportement de enable_backprop de Chainer v2
À propos de l'environnement virtuel de Python version 3.7
À propos du sensor_mode et de l'angle de vue de la picamera
Mémorandum des débutants en python
Mémorandum sur le QueryDict de Django
A propos des arguments de la fonction setup de PyCaret
À propos des polices japonaises de matplotlib (pour Mac)
À propos de l'équation normale de la régression linéaire
Note de problèmes sur la coexistence du système Python 2/3
[Python] Chapitre 02-04 Bases du programme Python (À propos des commentaires)