2012-03-28 15 views
2

This post identifiziert ein "Feature", das ich deaktivieren möchte.
Aktuelles numpy Verhalten:Deaktivieren numpy Phantasie Indizierung und Zuordnung?

>>> a = arange(10) 
>>> a[a>5] = arange(10) 
array([0, 1, 2, 3, 4, 5, 0, 1, 2, 3]) 

Der Grund ist es ein Problem: sagt ich ein Array wollte zwei verschiedene Sätze von Werten auf beiden Seiten eines Breakpoint (zB ein „gebrochenes Potenzgesetzes“ für die Herstellung oder einige andere einfache stückweise Funktion). Ich könnte so etwas wie dies versehentlich tun:

>>> x = empty(10) 
>>> a = arange(10) 
>>> x[a<=5] = 0 # this is fine 
>>> x[a>5] = a**2 # this is not 
# but what I really meant is this 
>>> x[a>5] = a[a>5]**2 

Das erste Verhalten ergibt x[a>5] = a**2 etwas, was ich halte eingängig - die linke Seite und die rechte Seite Formen nicht einverstanden und die rechte Seite ist nicht Skalar, sondern numpy läßt mich tun Diese Aufgabe. Wie auf dem anderen Beitrag erwähnt, ist x[5:]=a**2 nicht erlaubt.

Also, meine Frage: Gibt es eine Möglichkeit, x[a>5] = a**2 eine Exception zu erhöhen anstatt die Zuweisung durchzuführen? Ich mache mir große Sorgen, dass sich in meinem Code Tippfehler verbergen, weil ich dieses Verhalten noch nie vermutet habe.

Antwort

2

Ich kenne keine Möglichkeit, eine Core-Numpy-Funktion zu deaktivieren. Statt das Verhalten deaktivieren könnten Sie versuchen np.select mit:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.select.html

In [110]: x = np.empty(10) 
In [111]: a = np.arange(10) 
In [112]: x[a<=5] = 0 
In [113]: x[a>5] = a**2 
In [114]: x 
Out[114]: array([ 0., 0., 0., 0., 0., 0., 0., 1., 4., 9.]) 

In [117]: condlist = [a<=5,a>5] 
In [119]: choicelist=[0,a**2] 
In [120]: x = np.select(condlist,choicelist) 
In [121]: x 
Out[121]: array([ 0, 0, 0, 0, 0, 0, 36, 49, 64, 81]) 
+0

Cool, das ist eine nette Abhilfe - Ich beginne es in meinem Code jetzt verwenden. explizit> implizit, immerhin ... – keflavich

Verwandte Themen