2012-03-28 105 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