2013-09-01 8 views
14

Hier ist mein Code:Numpy Attribute: ‚schweben‘ Objekt hat kein Attribut ‚exp‘

def sigmoid(X, T): return (1.0/(1.0 + np.exp(-1.0*np.dot(X, T)))) 

und diese Zeile gibt mir Fehler „Attribute:‚schweben‘Objekt hat kein Attribut‚exp‘“. X, t sind Numpy ndarray.

+4

Sieht so aus, als hätten Sie 'np' einem Gleitkommawert zugewiesen. –

+4

Wäre 'X' oder' T' zufällig mit einem dtype von 'object' anstelle von' float64' erstellt worden? – user2357112

+1

Nein, neu zugewiesen wurde nicht passieren. type (X) ist numpy ndarray, type (X [0] [0]) ist float –

Antwort

11

Wahrscheinlich ist es etwas falsch mit den Eingabewerten für X und/oder T. Die Funktion von der Frage ok funktioniert:

import numpy as np 
from math import e 

def sigmoid(X, T): 
    return 1.0/(1.0 + np.exp(-1.0 * np.dot(X, T))) 

X = np.array([[1, 2, 3], [5, 0, 0]]) 
T = np.array([[1, 2], [1, 1], [4, 4]]) 

print X.dot(T) 
print 
# Just to see if values are ok 
print [1./(1. + e ** el) for el in [-5, -10, -15, -16]] 
print 
print sigmoid(X, T) 

Ergebnis:

[[15 16] 
[ 5 10]] 

[0.9933071490757153, 0.9999546021312976, 0.999999694097773, 0.9999998874648379] 

[[ 0.99999969 0.99999989] 
[ 0.99330715 0.9999546 ]] 

Wahrscheinlich ist es die dtype Ihrer Eingabe Arrays. Ändern X:

X = np.array([[1, 2, 3], [5, 0, 0]], dtype=object) 

Gibt:

Traceback (most recent call last): 
    File "/[...]/stackoverflow_sigmoid.py", line 24, in <module> 
    print sigmoid(X, T) 
    File "/[...]/stackoverflow_sigmoid.py", line 14, in sigmoid 
    return 1.0/(1.0 + np.exp(-1.0 * np.dot(X, T))) 
AttributeError: exp 
+3

Ja danke. Ich wusste nicht über dtype und verwendet nur Typ (X). Ich habe X = X.astype (float) und es funktioniert. –

+0

so Array-Operationen wie mean() konnte nicht in Arrays mit dype = Objekt verwendet werden? Ich wundere mich warum? – gcamargo

+2

Diese Fehlermeldung ist sehr irreführend: Das Problem ist, dass der "dtype" in der Tat "numpy.object" ist, aber die Nachricht sagt "numpy.float64" hat kein Attribut "log10", oder was auch immer arithmetische Methode – deeenes

4

Sie Typ konvertieren np.dot(X, T) wie folgt float32:

z=np.array(np.dot(X, T),dtype=np.float32)

def sigmoid(X, T): 
    return (1.0/(1.0 + np.exp(-z))) 

Hoffentlich wird es endlich arbeiten!

Verwandte Themen