In jedem Python Iteration
for x in np.nditer(A):
x = (x - minimum)/(maximum - minimum)
eine Zuordnung Der Wert für die Iterationsvariable ändert seine Referenz und ändert nicht die ursprüngliche Liste/das ursprüngliche Array.
versuchte ich
for x in np.nditer(A):
x[:] = (x - minimum)/(maximum - minimum)
bekam aber einen Fehler
ValueError: assignment destination is read-only
ich in die nditer
Dokumentation gehen, https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.nditer.html#arrays-nditer um herauszufinden, wie es zu einem Lese ändern/schreiben variable
In [388]: def normalize_min_max(A, axis = None):
...: ptr = axis
...: minimum = np.amin(A, ptr)
...: maximum = np.amax(A, ptr)
...: for x in np.nditer(A, op_flags=['readwrite']):
...: x[...] = (x - minimum)/(maximum - minimum)
...: return A
...:
...:
In [389]: normalize_min_max(np.arange(10))
Out[389]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
Hoppla, das ursprüngliche Array ist eine Ganzzahl
In [390]: normalize_min_max(np.arange(10.))
Out[390]:
array([ 0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
Aber ich brauche nicht diese Art von Berechnung auszuführen iterieren:
In [391]: def normalize_min_max1(A, axis = None):
...: ptr = axis
...: minimum = np.amin(A, ptr, keepdims=True)
...: maximum = np.amax(A, ptr, keepdims=True)
...: return (A-minimum)/(maximum-minimum)
In [392]: normalize_min_max1(np.arange(10.))
Out[392]:
array([ 0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
nditer
hat in diesem Zusammenhang der Arbeit, weil die Iterationsvariable veränderbar ist, wo, da es nicht mit for x in A: ...
ist . Aber ansonsten ist es ein komplexer Iterator und bietet keine Geschwindigkeitsvorteile. Wie auf der Tutorial-Seite nditer
gezeigt, ist es am nützlichsten, um nditer
in cython
zu verwenden.
Auch Ihr nditer
Code funktioniert nicht mit Achsenwerten. Mine, mit dem keep_dims
Parameter arbeitet:
In [396]: normalize_min_max1(np.arange(10.).reshape(5,2),0)
Out[396]:
array([[ 0. , 0. ],
[ 0.25, 0.25],
[ 0.5 , 0.5 ],
[ 0.75, 0.75],
[ 1. , 1. ]])
In [397]: normalize_min_max1(np.arange(10.).reshape(5,2),1)
Out[397]:
array([[ 0., 1.],
[ 0., 1.],
[ 0., 1.],
[ 0., 1.],
[ 0., 1.]])
In [398]: normalize_min_max1(np.arange(10.).reshape(5,2),None)
Out[398]:
array([[ 0. , 0.11111111],
[ 0.22222222, 0.33333333],
[ 0.44444444, 0.55555556],
[ 0.66666667, 0.77777778],
[ 0.88888889, 1. ]])
Der nditer
Code mit einer Achse Wert:
In [395]: normalize_min_max(np.arange(10.).reshape(5,2),0)
...
ValueError: could not broadcast input array from shape (2) into shape()
Die nditer
Variable eine 0T Array ist, das es modifiziert werden kann. Dies erschwert jedoch die Verwendung der Min/Max-Werte, bei denen es sich um Arrays handeln kann. Wir müssten diese Arrays in das nditer
Setup aufnehmen. So ist es möglich, aber normalerweise nicht die zusätzliche Arbeit wert.
müssen Sie x nein zurückgeben? – percusse
@percusse Ich muss ein Array mit der gleichen Form aber neuen Werten zurückgeben – Hendrra