2016-10-21 3 views
-1

Ich definiere eine Funktion, die ich sowohl für numpy Arrays als auch für Skalare verwenden möchte.Wie behandelt man Nan in Funktionen, die sowohl für numpy als auch für Skalare verwendet werden sollen?

def inv(x): 
    return 1/x 

das gibt

A = np.zeros([4,4]) 
inv(A) 
array([[ inf, inf, inf, inf], 
     [ inf, inf, inf, inf], 
     [ inf, inf, inf, inf], 
     [ inf, inf, inf, inf]]) 

und Fehler mit einem Skalar

inv(0.0) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "<stdin>", line 2, in inv 
ZeroDivisionError: float division by zero 

diese Nullwerte ermitteln inf in numpy Arrays zurück I numpy.where für numpy Arrays verwenden können, und wenn (a == 0) für Skalare.

Kennen Sie eine Möglichkeit, dies zu schreiben, die sowohl für numpy Arrays als auch für Skalare geeignet ist?

Dank

GB

+2

Sie können Nympy-Arrays der Länge = 1 anstelle von Skalaren verwenden, wie zum Beispiel 'a = np.array (0.0)', was Ihnen 'In [] inv (a) Out []: inf 'liefert. Dies ist ein Matlab-Ansatz. – Alexander

+0

Das möchte ich vermeiden ... – spec3

Antwort

1

0.0 ist kein numpy Skalar, es ist ein Python float ist. Füttern Sie es mit einem echten numpigen Skalar: numpy.float_(0.) (oder Ihren bevorzugten Float-Typ) und es wird wie erwartet funktionieren.

anzumerken, dass numpy.float_, numpy.float16, numpy.float32 usw. unterschiedlich sind numpy.float(), was zu Python entspricht float() (wie durch @dawg hingewiesen).

Überprüfen Sie beide mit type das Problem zu offenbaren:

type(0.0) 
>>> <class 'float'> 
type(numpy.float_(0.0)) 
>>> <class 'numpy.float64'> 

numpy.float == float 
>>> True 

Weitere Details hier: https://docs.scipy.org/doc/numpy-1.10.1/reference/arrays.scalars.html, beachten Sie die Kernaussage:

Array Skalare haben die gleichen Attribute und Methoden wie ndarrays

+1

Sie sollten betonen, dass 'np.float' und' np.float_' unterschiedlich sind. 'np.float == float' ist' True' und 'np.float_' ist ein numpiger Typ. – dawg

+0

Sorry, vielleicht war die Frage nicht klar genug, aber mein Hauptanliegen ist es, einen Weg zu finden, mit numpy.arrays und Skalaren auf die gleiche Weise umzugehen. – spec3

+0

@ spec3, tatsächlich; Meine Antwort ist, dass Ihre Funktionen zu numpy skalaren Typen erwarten oder konvertieren sollten, die Ihnen erlauben, jede der numpy Funktionen direkt zu verwenden. Versuchen Sie Ihre Funktion mit 'numpy.float_ (0.0)' als Parameter ... es gibt 'inf' wie erwartet zurück. Ich sehe keine andere Möglichkeit, das Typ-Problem zu umgehen, wenn es sich wie ein numpliges Array/Skalar verhalten soll, dann muss es ein numpliges Array/Skalar sein. – Benjamin

1

Verwenden Sie asanyarray, um den Parameter zu konvertieren:

>>> def inv(x): 
...  return 1/np.asanyarray(x) 
... 
>>> inv(0) 
inf 
>>> inv([0]) 
array([ inf]) 
Verwandte Themen