如何删除多行NumPy数组?

时间:2017-12-03 19:07:43

标签: python numpy

如何删除多行NumPy数组?例如,我想删除x的前五行。我正在尝试以下代码:

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

但它不起作用:

np.delete(x, (0:5), axis=0)
               ^
SyntaxError: invalid syntax

3 个答案:

答案 0 :(得分:6)

有几种方法可以从NumPy数组中删除行。

最简单的方法是使用基本索引和标准Python列表一样:

>>> 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]])

您不仅可以选择行,还可以选择列:

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

另一种方法是使用“花式索引”(使用数组索引数组):

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

您可以使用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]])

另一个选择是在问题中使用np.delete。要选择要删除的行/列,它可以接受slice个对象,int或整数数组:

>>> 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]])

但是这段时间我一直在使用NumPy我从来不需要这个np.delete,因为在这种情况下使用boolean indexing会更方便。

举个例子,如果我想删除/选择那些以大于12的值开头的行,我会这样做:

>>> 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]])

有关更多信息,请参阅有关索引的文档:https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

答案 1 :(得分:4)

如果要删除所选行,可以像

一样编写
np.delete(x, (1,2,5), axis = 0)

这将删除1,2和5行,如果你想删除像(1:5)那么试试这个

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

通过这个你可以删除数组中的0到4行。

np.s_ [0:5] ---&gt;&gt;切片(0,5,无) 两者都是一样的。

答案 2 :(得分:0)

将多个行号传递给列表参数。 一般语法:

np.delete(array_name,[rownumber1,rownumber2,..,rownumber n],axis=0)

示例:删除数组中的前三行:

np.delete(array_name,[0,1,2],axis=0)