[PYTHON] Über die Zuweisung von numpy.ndarray

Beachten Sie, dass ich süchtig nach der Zuweisung von numpy.ndarray war

Wenn Sie in drei Zeilen schreiben

ndarray Scheiben und Masken

Wie Sie wissen, kann ndarray dem durch Slice angegebenen Bereich zugewiesen werden.

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

Dies liegt daran, dass ndarray eine Referenz anstelle einer Kopie zurückgibt, wenn dies durch das Slice angegeben wird.

Sie können dasselbe auch mit einer Booleschen Maske tun.

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

es ist das gleiche.

Suchtpunkt: Ndarray Slice und Maskenkette

Lassen Sie uns das verketten.

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

Da das Slice Referenz zurückgibt, ist die Referenz der Referenz Referenz, sodass wir sie sicher der ursprünglichen Tabelle zuweisen konnten. Es ist einfach. Machen wir jetzt dasselbe für Masken.

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  #Nicht zugeordnet!!!!
Out[4]:
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

Nun, ich habe ein anderes Ergebnis erzielt als ich erwartet hatte.

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  #Nicht zugeordnet!!!!
Out[4]:
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

Gleiches gilt für die Maske + Slice-Kette.

Was meinst du ...

Ursache und Beschreibung

Eine ausführliche Erklärung finden Sie in der offiziellen Dokumentation. http://scipy-cookbook.readthedocs.io/items/ViewsVsCopies.html

But fancy indexing does seem to return views sometimes, doesn't it? Wenn Sie den Abschnitt von überprüfen

sample1.py


>>> a = numpy.arange(10)
>>> a[[1,2]] = 100
>>> a
array([  0, 100, 100,   3,   4,   5,   6,   7,   8,   9])

Wann

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])

Erklärt den Unterschied. Dieses Muster ist auch diesmal.

Abschließend, Die Maske (Fancy Index) hat keine Ansicht zurückgegeben.

Die Maske konnte das ursprüngliche Objekt nicht überschreiben, weil es eine Ansicht zurückgab, sondern weil der Python-Interpreter es in einen Inplace-Ausdruck konvertierte.

fancy_index1.py


>>> a[[1,2]] = 100

Ist

fancy_index1_translated.py


a.__setitem__([1,2], 100)

Dies bedeutet, dass sich der ursprüngliche Wert von a geändert hat, weil er in konvertiert wurde. Jedoch,

fancy_index2.py


c1 = a[[1,2]]

Ist

fancy_index2_translated.py


c1 = a.__getitem__([1,2])

Da anstelle einer Ansicht und einer Ansicht eine Kopie zurückgegeben wird, ändert sich das Ergebnis in dem Moment, in dem es in zwei Zeilen unterteilt wird.

Auf diese Weise können auch die Ergebnisse von chain2.py und chain3.py erklärt werden.

table[1, [True, True, True, False, False]]

Gibt eine Kopie zurück. Unabhängig davon, wie oft Sie sie danach überschreiben, wird die ursprüngliche Tabelle nicht geändert.

Endlich das Problem

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]: ???

Welches Ergebnis gibt dies zurück?

Recommended Posts

Über die Zuweisung von numpy.ndarray
Über alles von numpy
Über Variable von Chainer
Informationen zur kumulativen Zuordnung von Liste und Numpy-Array
Über max_iter von LogisticRegression () von scikit-learn
Über den japanischen Weg von Pyminizip
Über die japanische Unterstützung von Cometchat
Über verschiedene Codierungen von Python 3
Über alle von numpy (2.)
Über die Kostenberechnung von MeCab
Über den ungefähren Bruchteil des Umfangsverhältnisses
Über die Komponenten von Luigi
Über die HOG-Ausgabe von Scikit-Image
Über die Funktionen von Python
Über die Datenverwaltung von Amboss-App-Server
Über den Rückgabewert von pthread_mutex_init ()
Über den Rückgabewert des Histogramms.
Über den Grundtyp von Go
Über die Obergrenze von Threads-max
Über die zirkuläre Überkreuzung genetischer Algorithmen
Über das Verhalten von Yield_per von SqlAlchemy
Informationen zum Importfehler von PyQt5.QtWidgets (Anaconda)
Über die Größe der Punkte in Matplotlib
Über die Farbhalbtonverarbeitung von Bildern
Informationen zur Grundlagenliste der Python-Grundlagen
Informationen zum Erstellen einer GUI mit TKinter of Python
Informationen zum Verhalten von enable_backprop von Chainer v2
Informationen zur virtuellen Umgebung von Python Version 3.7
Über sensor_mode und Blickwinkel der Picamera
Memorandum von Python-Anfängern
Memorandum zu Djangos QueryDict
Über die Argumente der Setup-Funktion von PyCaret
Über japanische Schriften von matplotlib (für Mac)
Über die Normalgleichung der linearen Regression
Hinweis auf Probleme hinsichtlich der Koexistenz des Python 2/3-Systems
[Python] Kapitel 02-04 Grundlagen des Python-Programms (Informationen zu Kommentaren)