前言

        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]

📢 互动时间
        本文的代码和思路是否解决了你的问题?欢迎在评论区分享你的想法或疑问!无论是更好的实现方式,还是遇到的其他问题,都可以详细描述,我会第一时间与你交流探讨。你的点赞/收藏是我持续创作的动力,技术无边界,让我们一起进步!🚀💬 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐