Python数组切片与索引汇总!超详细!
·
前言
Numpy是高性能计算和数据分析的基础包,其可以通过索引的方式获取Numpy数组中的某个元素,或通过切片的方式获取数组中一块数据。
一、索引
1、正负索引
arr = np.array([1, 2, 3, 4, 5, 6, 7])
正索引: [0, 1, 2, 3, 4, 5, 6]
元素: [1, 2, 3, 4, 5, 6, 7]
负索引: [-7, -6, -5, -4, -3, -2, -1]
2、普通索引(正)
将每个维度的索引值单独放到一个方括号"[]"中,拼接多个维度的索引值来获得某一个元素值,示例如下:
import numpy as np
a = np.array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])
b = a[1][2]
print("数组a的第1行第2列元素为:\n", b)
c = a[2][2]
print("数组a的第2行第2列元素为:\n", c)
输出结果如下:
数组a的第1行第2列元素为:
6
数组a的第2行第2列元素为:
10
2、布尔索引(正)
Numpy还可提供直接的数组比较,数组比较以后会产生布尔值(True/False),这些布尔值可用于定位特定的元素并为其赋值,示例如下:
import numpy as np
a = np.random.randint(-6, 6, size = (4, 5))
print("数组对象a的原始值:\n", a)
index = (a <=0) # 单条件索引
print("单条件索引的布尔数组:\n", index)
a[index] = 0 # 将布尔索引取值为True的对应位置上的数据赋值为0
print("数组对象a的新值:\n", a)
输出结果如下:
数组对象a的原始值:
[[ 1 0 0 5 -1]
[-2 2 -3 -1 5]
[-5 5 0 -5 2]
[ 0 -1 -5 -6 5]]
单条件索引的布尔数组:
[[False True True False True]
[ True False True True False]
[ True False True True False]
[ True True True True False]]
数组对象a的新值:
[[1 0 0 5 0]
[0 2 0 0 5]
[0 5 0 0 2]
[0 0 0 0 5]]
3、遍历索引(正)
# 第一种方法
a = np.arange(9).reshape(3, 3)
for i in range(3):
for j in range(3):
print(a[i, j])
# 第二种方法
for i in np.nditer(a):
print(i)
# 输出结果相同:
# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
二、切片
逗号",":分隔各个维度;冒号":":表示各个维度内的切片;只有单独一个":"表示取这个维度的全部值。
1、一维数组(正切片)
import numpy as np
a = np.arange(6)
print("一维数组a的元素为:\n", a) # [0,1,2,3,4,5]
# a[i:j]:获取a[i]~a[j-1]的元素
print(a[1:2]) # [1]
print(a[0:3]) # [0 1 2]
# a[:-n]:去掉最后n个字符
print(a[:-2]) # [0 1 2 3]
# a[-n:]:取最后n个字符
print(a[-2:]) # [4 5]
# a[i:j:k]--->a[start, end, step](a[起始位置,终止位置,步长])丨起始位置默认为0,步长默认为1
print(a[1:5:2]) # [1 3]
# a[::]/a[...]:输出完整数组
print(a[::]) # [0 1 2 3 4 5]
print(a[...]) # [0 1 2 3 4 5]
# a[::-1]:从最后一个元素到时第一个元素都输出一遍(反向)
print(a[::-1]) # [5 4 3 2 1 0]
2、二维数组(正切片)
a[第一维(行), 第二维(列)](值都是从0开始);示例如下:
import numpy as np
# 生成形状为3*4(3行,4列)的二维数组
a = np.arange(12).reshape(3, 4)
print("数组对象a:\n", a)
# 数组对象a:
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
b = a[1][1]
print("数组a的第1行第1列元素为:", b)
# 数组a的第1行第1列元素为: 5
# a[:,0]:取所有行的第0个数据(第0列上的所有数据)
print(a[:,0]) # [0 4 8]
# a[1,:]:取第一维中下标为1的元素的所有数据(第1行上的所有数据)
print(a[1,:]) # [4 5 6 7]
# a[:,1]:取所有行的第1个数据(第1列上的所有数据)
print(a[:,1]) # [1 5 9]
# a[:,1:]:取第一维(所有行)中的所有元素,从第一列开始取
print(a[:,1:])
#[[ 1 2 3]
# [ 5 6 7]
# [ 9 10 11]]
# a[:2,1:]:第一维:取第2行之前,即第0、1行;第二维:从第一列开始取
print( a[:2,1:])
# [[1 2 3]
# [5 6 7]]
# a[::2]:从第0行开始,每次跳两行取数据
print(a[::2])
# [[ 0 1 2 3]
# [ 8 9 10 11]]
# 计算每行的平均值
print(a.mean(axis=1)) # [1.5 5.5 9.5]
# 计算每列的平均值
print(a.mean(axis=0)) # [4. 5. 6. 7.]
# 获取最大值索引
print(a.argmax()) # 11
3、三维数组(正切片)
a[第一维(第X个二维数组), 第二维(行),第三维(列)](值都是从0开始),示例如下:
import numpy as np
#生成形状为(2,3,4)的数组——两个3*4的二维数组叠加
a = np.arange(24).reshape(2, 3, 4)
print("数组对象a:\n", a)
# 数组对象a:
# [[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]]
# a[1,1,2]:表示第一维取1,第二维取1,第三维取2
print(a[1,1,2]) # 18
# a[:,1,2]表示第一维全取,第二维取1,第三维取2
print(a[:,1,2]) # [ 6 18]
# a[:,1:,2]表示第一维全取,第二维取1及1之后的所有值,第三维取2
print(a[:,1:,2])
# [[ 6 10]
# [18 22]]
# a[:,1:,:2]表示第一维全取,第二维取1及1之后的所有值,第三维取2之前的值(0,1)
print(a[:,1:,:2])
# [[[ 4 5]
# [ 8 9]]
# [[16 17]
# [20 21]]]
b = a[0:1:1, 0:2:1, ...] #起始位置:截止位置:步长
print("\n第1次切片的结果:\n", b)
# 第1次切片的结果:
# [[[0 1 2 3]
# [4 5 6 7]]]
c = a[:1, :2] #省略了起始位置(默认为0),步长(默认为1)
print("\n第2次切片的结果:\n", c)
# 第2次切片的结果:
# [[[0 1 2 3]
# [4 5 6 7]]]
4、负切片(与索引同理)
# 正索引: [0, 1, 2, 3, 4, 5, 6]
# 元素: [1, 2, 3, 4, 5, 6, 7]
# 负索引: [-7, -6, -5, -4, -3, -2, -1]
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7])
# 负索引:[-3,-2]----->正索引:[4,5]------>输出:[5 6]
print(arr[-3:-1]) # [5 6]
# 负索引:[-6,-3]----->正索引:[1,4]------>输出:[2 3 4 5]
print(arr[-6:-2]) # [2 3 4 5] ————>[-6,-3]
📢 互动时间
本文的代码和思路是否解决了你的问题?欢迎在评论区分享你的想法或疑问!无论是更好的实现方式,还是遇到的其他问题,都可以详细描述,我会第一时间与你交流探讨。你的点赞/收藏是我持续创作的动力,技术无边界,让我们一起进步!🚀💬
更多推荐




所有评论(0)