This post识别了一个我想禁用的“特性”。
当前的粗野行为:
>>> 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而不是执行任务?我非常担心我的代码中隐藏了排字,因为我以前从未怀疑过这种行为。
发布于 2012-03-28 16:04:33
我不知道有什么方法可以直接禁用核心的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])https://stackoverflow.com/questions/9911265
复制相似问题