2012-03-28 49 views
2

This post標識了我想禁用的「功能」。
當前numpy的行爲:禁用numpy花哨索引和分配?

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

這是一個問題的原因是:說我想要一個數組有斷點的兩側(例如,用於製作「破冪律」或兩個不同的價值觀一些其他簡單的分段功能)。我可能會不小心做這樣的事情:

>>> 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 

第一種行爲,x[a>5] = a**2得到的東西我會有悖常理考慮 - 左側和右側的形狀不同意右側是不是標量,但numpy的讓我做這個任務。正如另一篇文章所指出的,x[5:]=a**2是不允許的。

所以,我的問題:有沒有辦法讓x[a>5] = a**2籌集Exception而不是執行任務?我非常擔心我的代碼中隱藏了拼寫錯誤,因爲我之前從未懷疑過這種行爲。

回答

2

我不知道如何禁用核心numpy功能。相反,禁止行爲的,你可以嘗試使用np.select:

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

酷,這是一個不錯的解決方法 - 我現在開始在我的代碼中使用它。畢竟...顯式>隱式... – keflavich 2012-03-28 16:15:11