【问题标题】:Disable numpy fancy indexing and assignment?禁用 numpy 花式索引和分配?
【发布时间】:2012-04-12 06:24:19
【问题描述】:

This post 标识了我要禁用的“功能”。
当前的 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&gt;5] = a**2 产生了一些我认为违反直觉的东西 - 左侧和右侧形状不一致 并且 右侧不是标量,但 numpy 让我做这个分配。正如在另一篇文章中指出的那样,x[5:]=a**2 是不允许的。

所以,我的问题是:有什么方法可以让x[a&gt;5] = a**2 提出Exception 而不是执行任务?我非常担心我的代码中隐藏了拼写错误,因为我以前从未怀疑过这种行为。

【问题讨论】:

    标签: numpy


    【解决方案1】:

    我不知道禁用核心 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])
    

    【讨论】:

    • 酷,这是一个很好的解决方法 - 我现在将开始在我的代码中使用它。显式 > 隐式,毕竟...
    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 2021-10-24
    • 2017-12-28
    • 2012-08-01
    • 2016-04-28
    相关资源
    最近更新 更多