NumPy 切片和索引

发布于 2024-10-05 13:26:33 字数 3499 浏览 8 评论 0

ndarray 对象的内容可以通过索引或切片来访问和修改,就像 Python 的内置容器对象一样。

如前所述, ndarray 对象中的元素遵循基于零的索引。 有三种可用的索引方法类型: 字段访问,基本切片高级索引

基本切片是 Python 中基本切片概念到 n 维的扩展。 通过将 startstopstep 参数提供给内置的 slice 函数来构造一个 Python slice 对象。 此 slice 对象被传递给数组来提取数组的一部分。

示例 1

import numpy as np
a = np.arange(10)
s = slice(2,7,2)  
print(a[s])

输出如下:

[2  4  6]

在上面的例子中, ndarray 对象由 arange() 函数创建。 然后,分别用起始,终止和步长值 272 定义切片对象。 当这个切片对象传递给 ndarray 时,会对它的一部分进行切片,从索引 27 ,步长为 2

将由冒号分隔的切片参数( start:stop:step )直接提供给 ndarray 对象,也可以获得相同的结果。

示例 2

import numpy as np
a = np.arange(10)
b = a[2:7:2]  
print(b)

输出如下:

[2  4  6]

如果只输入一个参数,则将返回与索引对应的单个项目。 如果使用 a: ,则从该索引向后的所有项目将被提取。 如果使用两个参数(以 : 分隔),则对两个索引(不包括停止索引)之间的元素以默认步骤进行切片。

示例 3

# 对单个元素进行切片  
import numpy as np

a = np.arange(10)
b = a[5]  
print(b)

输出如下:

5

示例 4

# 对始于索引的元素进行切片  
import numpy as np
a = np.arange(10)  
print(a[2:])

输出如下:

[2  3  4  5  6  7  8  9]

示例 5

# 对索引之间的元素进行切片  
import numpy as np
a = np.arange(10)  
print(a[2:5])

输出如下:

[2  3  4]

上面的描述也可用于多维 ndarray

子矩阵

示例 6

import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print(a)
# 对始于索引的元素进行切片  
print('现在我们从索引 a[1:] 开始对数组切片') 
print(a[1:])

# 多维数据可以按照各个维度进行切片来截取子矩阵
print('\n')
print(a[1:3, 1:])

输出如下:

[[1 2 3]
 [3 4 5]
 [4 5 6]]

现在我们从索引 a[1:] 开始对数组切片
[[3 4 5]
 [4 5 6]]

[[4 5]
 [5 6]]

增加维度

print(a[:, None], a[:, None].shape, '\n')
[[[1 2 3]]

 [[3 4 5]]

 [[4 5 6]]] 

 (3, 1, 3)

这里应该是大家最疑惑的地方了,为什么列的参数改成 None,输出的 shape 都变了,这里大家要知道,None 代表新增加一个维度,它有一个别称叫 newaxis,大家可以输出一下 numpy.newaxis 就知道了,那么这个别称应该顾名思义了吧。那么为什么是 5x1x5,而不是 5x5x1 呢,那是因为你在第二维上用了 None,你如果在第三维上用就会变成 5x5x1 了,不信你看

print(a[:, :, None], '\n\n', a[:, :, None].shape, '\n')
[[[1]
  [2]
  [3]]

 [[3]
  [4]
  [5]]

 [[4]
  [5]
  [6]]] 

 (3, 3, 1)

全选维度

切片还可以包括省略号( ... ),来使选择结果的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray

三个点是什么鬼,凭记忆这不是可以换行的操作么,但这里不是,它是省略所有的冒号来用省略号代替,大家看这个 a[:, :, None]和 a[…, None]的输出是一样的,就是因为…代替了前面两个冒号。这下应该清楚了。 至于三维以上的,那跟二维是一模一样啊。

示例 7

# 最开始的数组  
import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print('我们的数组是:') 
print(a)
print('\n')
# 这会返回第二列元素的数组:  
print('第二列的元素是:')
print(a[...,1])
print('\n')  
# 现在我们从第二行切片所有元素:  
print('第二行的元素是:')
print(a[1,...])
print('\n')
# 现在我们从第二列向后切片所有元素:
print('第二列及其剩余元素是:')
print(a[...,1:])

输出如下:

我们的数组是:
[[1 2 3]
 [3 4 5]
 [4 5 6]]

第二列的元素是:
[2 4 5]

第二行的元素是:
[3 4 5]

第二列及其剩余元素是:
[[2 3]
 [4 5]
 [5 6]]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

梦忆晨望

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

qq_BY4R7o

文章 0 评论 0

13696529860

文章 0 评论 0

qq_M1hW18

文章 0 评论 0

qq_4zWU6L

文章 0 评论 0

薄暮涼年

文章 0 评论 0

恬淡成诗

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文