Numpy: Funktionsaufruf/Loop für alle Indizes

26/02/2010 - 11:26 von Ole Streicher | Report spam
Hallo Gruppe,

Ich möchte gerne (in numpy) über alle Indizes eines mehrdimensionalen
Arrays, deren Elemente eine bestimmte Bedingung erfüllen, iterieren.

Folgender Versuch schlug fehl:

8<--
import numpy

def myfunc(x):
print 'myfunc of', x

a = numpy.random.random((2,3,4))
numpy.apply_along_axis(myfunc, 0, numpy.where(a > 0.8))
8<--

Das gibt einfach den ersten Index aus und stoppt dann mit einem
TypeError: object of type 'NoneType' has no len()

Was ist an meinem Code falsch und wie sollte ich mein Problem richtig
lösen?

Viele Grüße

Ole
 

Lesen sie die antworten

#1 Peter Otten
26/02/2010 - 12:45 | Warnen spam
Ole Streicher wrote:

Hallo Gruppe,

Ich möchte gerne (in numpy) über alle Indizes eines mehrdimensionalen
Arrays, deren Elemente eine bestimmte Bedingung erfüllen, iterieren.

Folgender Versuch schlug fehl:

8<--
import numpy

def myfunc(x):
print 'myfunc of', x

a = numpy.random.random((2,3,4))
numpy.apply_along_axis(myfunc, 0, numpy.where(a > 0.8))
8<--

Das gibt einfach den ersten Index aus und stoppt dann mit einem
TypeError: object of type 'NoneType' has no len()

Was ist an meinem Code falsch und wie sollte ich mein Problem richtig
lösen?



Kleines Experiment:

import numpy
a = numpy.array([[1,2,3],[4,5,6]])
a






array([[1, 2, 3],
[4, 5, 6]])
numpy.apply_along_axis(lambda x: x[0], 0, a)






array([1, 2, 3])
numpy.apply_along_axis(lambda x: x[0], 1, a)






array([1, 4])

Daraus ergibt sich, dass apply_... eher map_... heißen müsste. Ob es auch
eine Funktion gibt, die kein neues array aufbaut, weiß ich nicht. Zur Not
könntest Du Deine Funktion so umschreiben, dass Sie einen Wert zurückgibt
und das Ergebnis verwerfen:

def myfunc(x):






... print "myfunc", x
... return x
...
a = numpy.random.random((2,3,4))
numpy.apply_along_axis(myfunc, 0, numpy.where(a>.8))






myfunc [0 0 0]
myfunc [0 0 3]
myfunc [1 0 1]
myfunc [1 1 0]
myfunc [1 1 1]
myfunc [1 1 2]
myfunc [1 2 1]
array([[0, 0, 1, 1, 1, 1, 1],
[0, 0, 0, 1, 1, 1, 2],
[0, 3, 1, 0, 1, 2, 1]])

Ähnliche fragen