Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to delete multiple rows of NumPy array?

Tags:

python

numpy

How can I delete multiple rows of NumPy array? For example, I want to delete the first five rows of x. I'm trying the following code:

import numpy as np
x = np.random.rand(10, 5)
np.delete(x, (0:5), axis=0)

but it doesn't work:

np.delete(x, (0:5), axis=0)
               ^
SyntaxError: invalid syntax
like image 446
vcx34178 Avatar asked Dec 03 '17 19:12

vcx34178


People also ask

How do I delete multiple rows in Python NumPy?

delete() – The numpy. delete() is a function in Python which returns a new array with the deletion of sub-arrays along with the mentioned axis. By keeping the value of the axis as zero, there are two possible ways to delete multiple rows using numphy. delete().

How do I delete rows in NumPy array based on condition?

np. delete(ndarray, index, axis): Delete items of rows or columns from the NumPy array based on given index conditions and axis specified, the parameter ndarray is the array on which the manipulation will happen, the index is the particular rows based on conditions to be deleted, axis=0 for removing rows in our case.


2 Answers

There are several ways to delete rows from NumPy array.

The easiest one is to use basic indexing as with standard Python lists:

>>> import numpy as np
>>> x = np.arange(35).reshape(7, 5)
>>> x
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34]])
>>> result = x[5:]
>>> result
array([[25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34]])

You can select not only rows but columns as well:

>>> x[:2, 1:4]
array([[1, 2, 3],
       [6, 7, 8]])

Another way is to use "fancy indexing" (indexing arrays using arrays):

>>> x[[0, 2, 6]]
array([[ 0,  1,  2,  3,  4],
       [10, 11, 12, 13, 14],
       [30, 31, 32, 33, 34]])

You can achieve the same using np.take:

>>> np.take(x, [0, 2, 6], axis=0)
array([[ 0,  1,  2,  3,  4],
       [10, 11, 12, 13, 14],
       [30, 31, 32, 33, 34]])

Yet another option is to use np.delete as in the question. For selecting the rows/columns for deletion it can accept slice objects, int, or array of ints:

>>> np.delete(x, slice(0, 5), axis=0)
array([[25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34]])
>>> np.delete(x, [0, 2, 3], axis=0)
array([[ 5,  6,  7,  8,  9],
       [20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34]])

But all this time that I've been using NumPy I never needed this np.delete, as in this case it's much more convenient to use boolean indexing.

As an example, if I would want to remove/select those rows that start with a value greater than 12, I would do:

>>> mask_array = x[:, 0] < 12  # comparing values of the first column
>>> mask_array
array([ True,  True,  True, False, False, False, False])
>>> x[mask_array]
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>> x[~mask_array]  # ~ is an element-wise inversion
array([[15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34]])

For more information refer to the documentation on indexing: https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

like image 126
Georgy Avatar answered Sep 29 '22 10:09

Georgy


If you want to delete selected rows you can write like

np.delete(x, (1,2,5), axis = 0)

This will delete 1,2 and 5 th line, and if you want to delete like (1:5) try this one

np.delete(x, np.s_[0:5], axis = 0)

by this you can delete 0 to 4 lines from your array.

np.s_[0:5] --->> slice(0, 5, None) both are same.

like image 36
Binit Amin Avatar answered Sep 29 '22 10:09

Binit Amin