2016-11-28 1 views
2

Wenn ichSubstraktion Nummer aus der Liste Anhebung nicht Typeerror

a = [1, 2, 7] 
a - a[-1] 

I TypeError: unsupported operand type(s) for -: 'list' and 'int'

Allerdings bekommen, habe ich eine Liste b aus np.float64, und der folgende Code funktioniert:

type(b) 
# list 
b - b[-1] 
# array([ 281.04209146, 6.57013103, 0.  ]) 

Ich denke, das ist, weil die Zahlen in bnp.float64 sind, und b ist s Omewhat casted zu np.array, dann Sendung geschieht. Aber ich fand dieses Verhalten immer noch überraschend: da alle Elemente in einer Liste nicht den gleichen Typ haben müssen, was wäre, wenn b[0] eine Zeichenkette gewesen wäre? Die Operanden in b - b[-1] wären immer noch list und np.float64 gewesen, warum also b - b[-1] keine TypeError auslösen?

EDIT: Jemand antwortete sagen, dass list und np.array verschieden sind; Nun Ich weiss. Aber dort b ist kein np.array. Es ist verhält sich wie einer, aber sein Typ ist list, wie ich im Codeausschnitt angegeben habe.

Hier ist ein minimales Arbeitsbeispiel für b:

b 
# [1598.717274996219, 1324.245314569733, 1317.6751835362861] 
type(b[0]) 
# numpy.float64 

Antwort

2

In einem Ausdruck wie A-B kann der Interpreter es entweder als A.__sub__(B) oder B.__rsub__(A) implementieren.

Listen implementieren mul und add aber nicht sub

In [29]: [1,2,3]*3 
Out[29]: [1, 2, 3, 1, 2, 3, 1, 2, 3] 
In [30]: [1,2,3]+[1] 
Out[30]: [1, 2, 3, 1] 
In [31]: [1,2,3]-3 
TypeError: unsupported operand type(s) for -: 'list' and 'int' 

np.ndarray ein __rsub__

In [32]: [1,2,3]-np.array([1,2,3]) 
Out[32]: array([0, 0, 0]) 
# np.array([1,2,3]).__rsub__([1,2,3]) 

implementiert und diese Methode versucht, den LHS in ein Array zu drehen, so dass dieser Ausdruck ist die gleiche wie:

In [33]: np.asarray([1,2,3]) - np.array([1,2,3]) 
Out[33]: array([0, 0, 0]) 

Wenn die Liste Zeichenfolgen enthält, das nicht klappt:

In [35]: ['a',2,3]-np.array([1,2,3]) 
TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U11') dtype('<U11') dtype('<U11') 

weil diese Liste ein Array von Strings wird:

In [36]: np.asarray(['a',2,3]) 
Out[36]: 
array(['a', '2', '3'], 
     dtype='<U1') 

und Array-Subtraktion mit String dtype ist nicht implementiert.

Alles, was ich mit dem Array RHS schrieb, gilt, wenn es np.float64 ist. verhält sich (in den meisten Kontexten) genauso wie np.array(10.0).

Also alle diese Subtraktionen mit b sind die gleichen:

b = [np.float64(10), np.float64(1)] 
b - b[-1] 
b - np.float64(1) 
b - np.array(1.0) 
np.array(b) - np.array(1.0) 

In Summe, wenn die rechte Seite eine Art von Array ist, stellt sich die LHS-Liste in eine als auch Array. Von da an ist es eine Frage, ob die 2 Arrays kompatibel sind (in Form und Dtyp).

1

Sie erhalten nicht die gleichen TypeError wenn Sie obwohl b[0] eine Zeichenfolge zu machen.

b=[np.float_(a_) for a_ in a] 

b 
Out[4]: [1.0, 2.0, 7.0] 

b-b[-1] 
Out[5]: array([-6., -5., 0.]) 

b[0]='a' 

b 
Out[7]: ['a', 2.0, 7.0] 

b-b[-1] 
Traceback (most recent call last): 

    File "<#>", line 1, in <module> 
    b-b[-1] 

TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32') 

Sie erhalten eine TypeError für Typen in subtract unpassende. Wenn Sie im Original eine np.float64 für b[-1] erhalten, wird der gesamte Ausdruck in numpy arrays umgewandelt. Also, wenn b[-1] ist ein String:

b[2]='a' 

b-b[-1] 
Traceback (most recent call last): 

    File "<#>", line 1, in <module> 
    b-b[-1] 

TypeError: unsupported operand type(s) for -: 'list' and 'str' 

sind Sie auf die ursprüngliche TypeError zurück.

+0

Ja, ich habe dieses Verhalten auch getestet. Sorry, wenn ich nicht klar war, meine Frage ist eher "Warum nicht' list - np.float "systematisch einen Fehler auslöst?". –

+0

Numpy ist 'hilfreich' (oder gierig, wenn es unerwünscht ist). Wenn es irgendwo in einem Ausdruck verwendet wird, versucht es überall zu sein. Wenn Sie also '[1,2,3] -np.array ([1,2,3])' 'machen, erhalten Sie' np.array ([0,0,0]) ' –

+0

Ok, also könnten Sie das klären 'es versucht '? Was sind die Überprüfungen? –

Verwandte Themen