Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why python numpy.delete does not raise indexError when out-of-bounds index is in np array

Tags:

python

list

numpy

When using np.delete an indexError is raise when an out-of-bounds index is used. When an out-of-bounds index is in a np.array used and the array is used as the argument in np.delete, why doesnt this then raise an indexError?

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

this gives an index-error, as it should (index 9 is out of bounds)

while

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

and

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

give:

array([0, 1, 2, 3, 4])
like image 855
marqram Avatar asked Jan 20 '16 11:01

marqram


People also ask

Does NP delete work in place?

Note that delete does not occur in-place. If axis is None, out is a flattened array.

How does Numpy delete work?

The numpy. delete() function returns a new array with the deletion of sub-arrays along with the mentioned axis. Return : An array with sub-array being deleted as per the mentioned object along a given axis.

How to fix IndexError index 0 is out of bounds for axis 0 with size 0?

The Python "IndexError: index 0 is out of bounds for axis 0 with size 0" occurs when we try to access the first item in the first dimension of an empty numpy array. To solve the error, use a try/except block or check if the array's size is not equal to 0 before accessing it at an index.

What does out of bounds mean in Python?

June 01, 2022. CWE-125 Out-of-Bounds Read is a type of software error that can occur when reading data from memory. This can happen if the program tries to read beyond the end of an array, for example.


1 Answers

This is a known "feature" and will be deprecated in later versions.

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]

Enabling DeprecationWarning in python actually shows this warning. 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])
like image 115
M4rtini Avatar answered Oct 13 '22 00:10

M4rtini