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