2017-02-15 4 views
0

Lassen Sie uns sagen, ich habenp.vectorize und nan - wie kann ich sie schön spielen lassen?

>>> import numpy as np 
>>> nv = np.array([-1, np.nan, 1]) 

np.sin als

>>> np.sin(nv) 
array([-0.84147098,   nan, 0.84147098]) 

jedoch erwartet, wenn ich versuche, dass es mit vectorize auf meine eigene Funktion

>>> def noneg(n): 
     if n < 0: 
      return 0 
     return n 
>>> noneg(nv) 
... 
ValueError: cannot convert float NaN to integer 

Dies ist nicht werden, weil Der Initialisierungswert, der von noneg zurückgegeben wird, ist die Ganzzahl Null, und dann erhalten wir nan, was ein float ist.

Die Lösung, die ich bisher gefunden habe ist:

>>> @np.vectorize 
    def noneg(n): 
     if not np.isnan(n) and n < 0: 
      return n.__class__(0) 
     return n 
>>> noneg(nv) 
array([ 0., nan, 1.]) 

Doch diese hässlich aussieht, gibt es eine bessere Art und Weise nan in vectorize zu ignorieren?

+0

was ist mit verschachtelten 'np.where'? –

+0

Geben Sie die "otypes" an. Ohne es wird der Rückgabewert 'dtype' durch eine Versuchsrechnung mit dem ersten Wert ermittelt. http://stackoverflow.com/a/41795777/901925 – hpaulj

Antwort

0

Hmm, hast du schon die Antwort geschrieben?

def noneg(n): 
    if n < 0: 
     return n.__class__(0) 
    return n 
noneg(nv) 

Das Problem hier ist die Variable 0 Ihren Eingabetyp nicht über ist, glaube ich.

Verwandte Themen