05_Numpy任意行&列的删除方法(numpy.delete)

05_Numpy任意行&列的删除方法(numpy.delete)

函数Numpy.delete()可以删除ndarray数组中任意的行或者列。

指定要删除的轴(维度)和要删除的位置(行号,列号)。也可以通过切片或列表选择多个行或者列的编号。

对以下的内容进行说明:

  • Numpy.delete()基本的使用方法

    • 删除指定的索引(行或者列):参数obj
    • 删除指定的轴(维度):参数axis
  • 一次删除多行和多列

    • 列表的指定
    • 切片的指定
    • 行和列的指定
  • 多维数组的例

Numpy.delete()基本的使用方法

  • Numpy.delete(arr,obj,axis=None)有以下3个参数:
    • arr:输入数组
    • obj:指定要通过的整数,切片或者列表(数组)删除的行号/列号
    • axis:要删除的轴

以下是2维数组的例:

import numpy as np

a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

稍后进行详细的说明,例如:当删除第2行时,obj=1且axis=0。此时原始数组不会被改变,而是创建该数组的新副本。

a_del = np.delete(a, 1, 0)
print(a_del)
# [[ 0  1  2  3]
#  [ 8  9 10 11]]

print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

删除指定的索引(行或者列):参数obj


在第2个参数obj中,从0开始指定要删除的索引角标(行号/列号),指定不存在的索引角标将返回错误。

print(np.delete(a, 0, 0))
# [[ 4  5  6  7]
#  [ 8  9 10 11]]

print(np.delete(a, 2, 0))
# [[0 1 2 3]
#  [4 5 6 7]]

# print(np.delete(a, 3, 0))
# IndexError: index 3 is out of bounds for axis 0 with size 3

删除指定的轴(维度):参数axis


在第3个参数axis中,从0开始指定要删除的轴(维度)。对于二维数组来说,行是第一维度(从0开始)。指定不存在的维度将返回错误。

print(np.delete(a, 1, 0))
# [[ 0  1  2  3]
#  [ 8  9 10 11]]

print(np.delete(a, 1, 1))
# [[ 0  2  3]
#  [ 4  6  7]
#  [ 8 10 11]]

# print(np.delete(a, 1, 2))
# AxisError: axis 2 is out of bounds for array of dimension 2

如果axis=None,则将obj指定的索引处的元素展平到一维后将其删除。由于轴的默认值为"无",因此如果省略的话,将执行默认的操作

print(np.delete(a, 1, None))
# [ 0  2  3  4  5  6  7  8  9 10 11]

print(np.delete(a, 1))
# [ 0  2  3  4  5  6  7  8  9 10 11]

一次删除多行和多列

如果在第二个参数obj中指定列表或切片,则可以一次删除多个行或列。

列表的指定


在列表中指定想要删除的行号或列号。

print(np.delete(a, [0, 3], 1))
# [[ 1  2]
#  [ 5  6]
#  [ 9 10]]

print(np.delete(a, [0, 1, 3], 1))
# [[ 2]
#  [ 6]
#  [10]]

切片的指定


[start:stop:step]格式来指定切片的范围,从而指定多个行或列。

Slice()的使用:
使用Slice()创建一个Slice对象,并在第2个参数obj中指定它。

如果只有1个参数,等效于[:stop],
如果只有2个参数,等效于[start:stop],
如果省略,则显式设置为None。

print(np.delete(a, slice(2), 1))
# [[ 2  3]
#  [ 6  7]
#  [10 11]]

print(np.delete(a, slice(1, 3), 1))
# [[ 0  3]
#  [ 4  7]
#  [ 8 11]]

print(np.delete(a, slice(None, None, 2), 1))
# [[ 1  3]
#  [ 5  7]
#  [ 9 11]]

np.s_的使用:
要以切片[start:stop:step]的形式描述时,也可以使用numpy.s_[]的书写方式(书写方式与Slice()相同)。

print(np.delete(a, np.s_[:2], 1))
# [[ 2  3]
#  [ 6  7]
#  [10 11]]

print(np.delete(a, np.s_[1:3], 1))
# [[ 0  3]
#  [ 4  7]
#  [ 8 11]]

print(np.delete(a, np.s_[::2], 1))
# [[ 1  3]
#  [ 5  7]
#  [ 9 11]]

行和列的指定


numpy.delete()无法一次删除多个维度(例如行和列)。要删除多个维度时,请重复使用numpy.delete()。

print(np.delete(np.delete(a, 1, 0), 1, 1))
# [[ 0  2  3]
#  [ 8 10 11]]

多维数组的例

到目前位置,为了方便起,都是按照2维数组的行和列进行的描述。但是对于三维甚至更高维度的数组,该概念是相同的。

以下面的数组为例。

a_3d = np.arange(24).reshape(2, 3, 4)
print(a_3d)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
# 
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

print(a_3d.shape)
# (2, 3, 4)

在参数axis上指定维度,参数obj指定索引。

print(np.delete(a_3d, 1, 0))
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]]

print(np.delete(a_3d, 1, 1))
# [[[ 0  1  2  3]
#   [ 8  9 10 11]]
# 
#  [[12 13 14 15]
#   [20 21 22 23]]]

print(np.delete(a_3d, 1, 2))
# [[[ 0  2  3]
#   [ 4  6  7]
#   [ 8 10 11]]
# 
#  [[12 14 15]
#   [16 18 19]
#   [20 22 23]]]

使用列表和切片的方法也是相同的。

print(np.delete(a_3d, [0, 3], 2))
# [[[ 1  2]
#   [ 5  6]
#   [ 9 10]]
# 
#  [[13 14]
#   [17 18]
#   [21 22]]]

print(np.delete(a_3d, np.s_[::2], 2))
# [[[ 1  3]
#   [ 5  7]
#   [ 9 11]]
# 
#  [[13 15]
#   [17 19]
#   [21 23]]]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值