Ich versuche zu verstehen, wie man mit nditer arbeitet, um eine Reduktion zu machen, in meinem Fall ein 3d-Array in ein 2d-Array zu konvertieren.Wie eine Reduktion mit numpy.nditer in der ersten Achse zu tun
Ich folgte die Hilfe hier http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html und es geschafft, eine Funktion zu erstellen, die der Eingangs Reduktion über die letzte Achse gilt. Mit dieser Funktion
def nditer_sum(data, red_axes):
it = numpy.nditer([data, None],
flags=['reduce_ok', 'external_loop'],
op_flags=[['readonly'], ['readwrite', 'allocate']],
op_axes=[None, red_axes])
it.operands[1][...] = 0
for x, y in it:
y[...] = x.sum()
return it.operands[1]
ich etwas Gleichwertiges zu data.sum bekommen kann (Achse = 2)
>>> data = numpy.arange(2*3*4).reshape((2,3,4))
>>> nditer_sum(data, [0, 1, -1])
[[ 6 22 38]
[54 70 86]]
>>> data.sum(axis=2)
[[ 6 22 38]
[54 70 86]]
So etwas Gleichwertiges zu data.sum bekommen (Achse = 0) ich, dass es, obwohl war genug, um das Argument red_axes zu [-1, 0,1] zu ändern, aber das Ergebnis ist ganz anders.
>>> data = numpy.arange(2*3*4).reshape((2,3,4))
>>> data.sum(axis=0)
[[12 14 16 18]
[20 22 24 26]
[28 30 32 34]]
>>> nditer_sum(data, [-1, 0, 1])
[[210 210 210 210]
[210 210 210 210]
[210 210 210 210]]
In dem for-Schleife innerhalb nditer_sum (für x, y in it :), der Iterator ist 2mal Looping und ein Array mit der Länge 12 jedes Mal statt Looping 12mal und gibt ein Array geben der Länge 2 jedes Mal. Ich habe lesen Sie die numpy Dokumentation mehrmals und googelte über diese kein Erfolg. Ich benutze numpy 1.6 und python 2.7
-1 in op_axes wird als "neue Achse" dokumentiert, ist es das, was Sie versuchen, machen? Auch Dokumentationen Feeds [[Größe x], [Größe y], [Größe z]] in op_axes, während Sie [None, [Größe 3]] drücken, ist das beabsichtigt? –
Die [Dokumentation] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.nditer.html) sagt "ein Operand ist eine Zuordnung von den Dimensionen des Iterators zu den Dimensionen des Operanden" ... Was auch immer das heißt. Im aktuellen Beispiel habe ich den Code im Tutorial [iterating over arrays] (http://docs.scipy.org/doc/numpy-dev/reference/arrays.nditer.html#reduction-iteration) kopiert, das funktioniert, aber nur mit der letzten Achse. In dem Beispiel hat das 3D-Array op_axes None (was äquivalent zu [-1, -1, -1] zu sein scheint) und die 2d-Achse hat [0, 1, -1] – Sergio
I, aber das ändert [0,1, - 1] bis [-1, 0, 1] würde die Reduktion auf der ersten Achse tun, aber es funktioniert nicht.Meine Frage ist, wie man die Reduktion auf einer beliebigen Achse durchführt. – Sergio