【问题标题】:Why python numpy.delete does not raise indexError when out-of-bounds index is in np array为什么当越界索引在np数组中时python numpy.delete不会引发indexError
【发布时间】:2016-04-26 05:18:00
【问题描述】:

使用 np.delete 时,如果使用越界索引,则会引发 indexError。当使用的 np.array 中有一个越界索引并且该数组用作 np.delete 中的参数时,为什么这不会引发 indexError?

np.delete(np.array([0, 2, 4, 5, 6, 7, 8, 9]), 9)

这给出了一个索引错误,因为它应该(索引 9 超出范围)

同时

np.delete(np.arange(0,5), np.array([9]))

np.delete(np.arange(0,5), (9,))

给:

array([0, 1, 2, 3, 4])

【问题讨论】:

  • 这个弃用终于被移除了,所以这会在 1.19 中出错

标签: python list numpy


【解决方案1】:

这是一个已知的“功能”,将在以后的版本中弃用。

From the source of numpy:

# Test if there are out of bound indices, this is deprecated
inside_bounds = (obj < N) & (obj >= -N)
if not inside_bounds.all():
    # 2013-09-24, 1.9
    warnings.warn(
        "in the future out of bounds indices will raise an error "
        "instead of being ignored by `numpy.delete`.",
        DeprecationWarning)
    obj = obj[inside_bounds]

在 python 中启用 DeprecationWarning 实际上会显示此警告。 Ref

In [1]: import warnings

In [2]: warnings.simplefilter('always', DeprecationWarning)

In [3]: warnings.warn('test', DeprecationWarning)
C:\Users\u31492\AppData\Local\Continuum\Anaconda\Scripts\ipython-script.py:1: De
precationWarning: test
  if __name__ == '__main__':

In [4]: import numpy as np

In [5]: np.delete(np.arange(0,5), np.array([9]))
C:\Users\u31492\AppData\Local\Continuum\Anaconda\lib\site-packages\numpy\lib\fun
ction_base.py:3869: DeprecationWarning: in the future out of bounds indices will
 raise an error instead of being ignored by `numpy.delete`.
  DeprecationWarning)
Out[5]: array([0, 1, 2, 3, 4])

【讨论】:

    猜你喜欢
    • 2017-01-05
    • 2012-06-10
    • 1970-01-01
    • 2010-10-14
    • 2013-07-27
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多