NumPy索引介绍之数组的索引和切片用法

 更新时间:2026年05月20日 14:42:47   作者:峡谷的小鱼  
NumPy的数组对象可以使用索引进行访问,支持基本切片、高级索引和字段访问,基本切片拓展到多维,但返回视图而非副本,高级索引通过整数和布尔索引实现,使用对象是布尔类型时也会进行高级索引,字段索引适用于结构化数组

NumPy的数组对象ndarrays可以和Python标准序列数据类型一样,使用 x[obj] 进行索引操作。其中,x是数组,obj是索引选择。有三种可用的索引:基本切片、高级索引、字段访问。

一、基本切片和索引

Python序列的切片操作是一维的,NumPy 将对数组的切片拓展到了N维。

基本切片语法 i:j:k:其中i是起始索引,j是停止索引,k是步长。

对于多维数组的索引 array[(x, y, z)]可以被简写成x[x, y, z],这也是NumPy的语法糖。

示例:

>>>x = np.arange(10)
>>>x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))

# 简单索引
>>>x[3]
3

# 一维切片
>>>x = np.arange(10)
>>>x[1:7:2]
array([1, 3, 5])

# 多维切片
>>>y = np.arange(20).reshape(4,5)
>>>y
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

>>>y[1:4, 1:4]
array([[ 6,  7,  8],
       [11, 12, 13],
       [16, 17, 18]])

# i和j为负,则可看作为n+i和n+j,n为维度中元素数量。
# k为负,则步长向前。
>>>x[-2:10]
array([8, 9])

>>>x[-3:3:-1]
array([7, 6, 5, 4])

# 默认写法 ":"
>>>x[4:]
array([4, 5, 6, 7, 8, 9])

# 如果索引元组的元素数小于维度,则假定任何其它维
>>> z = np.array([[[1],[2],[3]], [[4],[5],[6]]])
>>> z.shape
(2, 3, 1)
>>> z[1:2]
array([[[4],
        [5]
        [6]]])

# 索引中可以使用 "..." 代指其它维度的全部索引,一个索引中只能有一个省略号
>>>z[...,0]
array([[1, 2, 3],
        [4, 5, 6]])

# 使用newaxis 增加维度
>>>z[:,np.newaxis,:,:].shape
(2, 1, 3, 1)

注意

索引 ii:i+1的区别:

>>>z = np.array([[[1],[2],[3]], [[4],[5],[6]]])
>>>z[0, 0, 0], z[0:1, 0, 0]
(1, array([1]))
  • 可以使用切片来设置数组的值,但不能改变数组的形状
  • 基本切片只返回数据的视图,并不会返回数据的拷贝

二、高级索引

高级索引有两种类型:整数苏松阴和布尔索引。与基本切片不同,高级索引返回数组的副本。

2.1 整数数组索引

# 整数数组分别表示所需索引的下标。
# 取点[0,0], [1,1], [2,0]
>>>x = np.array([[1,  2],  [3,  4],  [5,  6]]) 
>>>x[[0,1,2],  [0,1,0]]  
array([1, 4, 5])

# 获取了 4X3 数组中的四个角的元素。 
# 行索引是 [0,0] 和 [3,3],而列索引是 [0,2] 和 [0,2]。

>>> x = array([[ 0,  1,  2],
               [ 3,  4,  5],
               [ 6,  7,  8],
               [ 9, 10, 11]])
>>> rows = np.array([[0, 0],
...                  [3, 3]], dtype=np.intp)
>>> columns = np.array([[0, 2],
...                     [0, 2]], dtype=np.intp)
>>> x[rows, columns]
array([[ 0,  2],
       [ 9, 11]])
# 使用np.ix_(rows, columns)获得相同效果
>>>x[[0,3], [0,2]

注意:

如果高级索引和基本切片的结果数组相同,优先使用切片。但是如果需要副本有不同的存储位置,则使用高级索引。

2.2 布尔索引

当索引对象是布尔类型时, 也会发生高级索引。

# 对于array[obj]
# 如果array.ndim == obj.ndim,
# 将返回一个一维数组,其中包含所有obj中为 True 的位置的元素,以row-major为顺序。
>>>x = np.array([[1., 2.], [np.nan, 3.], [np.nan, np.nan]])
>>>np.isnan(x),x[~np.isnan(x)]
(array([[False, False],
        [ True, False],
        [ True,  True]]),
 array([1., 2., 3.]))

# 使用ix_()功能
>>> x = array([[ 0,  1,  2],
               [ 3,  4,  5],
               [ 6,  7,  8],
               [ 9, 10, 11]])
>>> rows = (x.sum(-1) % 2) == 0
>>> rows
array([False,  True, False,  True])
>>> columns = [0, 2]
>>> x[np.ix_(rows, columns)]
array([[ 3,  5],
       [ 9, 11]])

2.3 字段索引

如果数组对象是结构化数组,则可以使用字符串索引来访问数组的字段。使用方式和字典类似。

>>> x = np.zeros((2,2), dtype=[('a', np.int32), ('b', np.float64, (3,3))])
>>>x
array([[(0, [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]]),
        (0, [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])],
       [(0, [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]]),
        (0, [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])]],
      dtype=[('a', '<i4'), ('b', '<f8', (3, 3))])

>>>x['a']
array([[0, 0],
        [0, 0]])
>>>x['a'].dtype
dtype('int32')

>>>x['b']
array([[[[0., 0., 0.],
          [0., 0., 0.],
          [0., 0., 0.]],
 
         [[0., 0., 0.],
          [0., 0., 0.],
          [0., 0., 0.]]],
 
 
        [[[0., 0., 0.],
          [0., 0., 0.],
          [0., 0., 0.]],
 
         [[0., 0., 0.],
          [0., 0., 0.],
          [0., 0., 0.]]]])
>>>x['b'].dtype
dtype('float64')


总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • OpenCV 使用imread()函数读取图片的六种正确姿势

    OpenCV 使用imread()函数读取图片的六种正确姿势

    这篇文章主要介绍了OpenCV 使用imread()函数读取图片的六种正确姿势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • python实现梯度下降和逻辑回归

    python实现梯度下降和逻辑回归

    这篇文章主要为大家详细介绍了python实现梯度下降和逻辑回归,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Python如何监控并获取内存使用情况

    Python如何监控并获取内存使用情况

    在Python开发中,监控内存使用情况对于性能优化和问题排查至关重要,本文将介绍多种获取内存使用情况的方法,大家可以根据自己的需要进行选择
    2026-03-03
  • 基于Python制作一副扑克牌过程详解

    基于Python制作一副扑克牌过程详解

    这篇文章主要介绍了基于Python制作一副扑克牌过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • python嵌套异常的两种处理器

    python嵌套异常的两种处理器

    在Python中,异常也可以嵌套,本文主要介绍了python嵌套异常的两种处理器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • Python将一个Excel拆分为多个Excel

    Python将一个Excel拆分为多个Excel

    这篇文章主要为大家详细介绍了Python将一个Excel拆分为多个Excel,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 带你精通Python正则表达式

    带你精通Python正则表达式

    本文将给大家分享一份关于比较详细的Python正则表达式宝典,学会之后你将对正则表达式达到精通的状态,一起来学习下面内容吧
    2021-08-08
  • Python实现按当前日期(年、月、日)创建多级目录的方法

    Python实现按当前日期(年、月、日)创建多级目录的方法

    这篇文章主要介绍了Python 按当前日期(年、月、日)创建多级目录的方法,实现代码很简单,需要的朋友可以参考下
    2018-04-04
  • Python实现Windows环境下自动备份文件到远程目录

    Python实现Windows环境下自动备份文件到远程目录

    这篇文章主要为大家详细介绍了如何使用Python实现Windows环境下自动备份文件到远程目录,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2026-02-02
  • python文件读取失败怎么处理

    python文件读取失败怎么处理

    在本篇文章里小编给大家分享的是关于python文件读取失败怎么处理的相关文章,需要的朋友们参考下。
    2020-06-06

最新评论