numpy索引取值和切片

numpy索引取值和切片

  • ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样,索引也是从0开始往后
  • 切片有两种方式,下面两种切片方式的区间,冒号两边也遵循左闭右开的规则:[...)
      1. 同列表[start:end:step]切片类似,ndarray 数组可以基于 0 - n 的索引,使用 "冒号"分隔来切片,且行和列的索引之间用”逗号“分隔,唯一不同的是,此时的start、end可以为一个int数字,也可以为一个列表
      1. 也可以通过内置的 slice(start,end,step) 函数进行切片,从原数组中切割出一个新数组

一、取行

1. 取某一行

  • 语法:ndarrar.[n] 或者 ndarrar.[n,:]
    • 后面的冒号表示列都要
import numpy as np
 
a = np.arange(24).reshape(4,6)
print(a)
print(a[2])  # 取第3行数据

"""
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
 
[12 13 14 15 16 17]
"""

2. 取连续多行

  • 语法:ndarrar.[start:end:step] 或者 ndarrar.[start:end:step,:]

    • 最后的冒号表示所有列都要

    • 当需要多行中的每隔几行来取,就要用到 step 步长这个参数了

import numpy as np
 
a = np.arange(24).reshape(4,6)
print(a)
print(a[2])  # 取第3行数据
print(a[:2])  # 取 第1行到第2行,[...)与python的列表切片一样,左闭右开的区间
print(a[1:2])  # 取第2行到第2行,左闭右开所以只取到第二行的数据

"""
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
 
[12 13 14 15 16 17]

[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
 
[[ 6  7  8  9 10 11]]
"""

3. 取不连续多行

  • 语法:ndarrar.[[m,n,...]] 或者 ndarrar.[[m,n,...],:]
    • 最后的冒号表示所有列都要
a = np.arange(24).reshape(4,6)
print(a)

print(a[[0,2,3]])  # 取第1行 第3行 第4行

"""
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

[[ 0  1  2  3  4  5]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
"""

二、取列

1. 取某一列

  • 语法:ndarrar.[:,n]
    • 前面的冒号表示行都要
a = np.arange(24).reshape(4,6)
print(a)

# print(a[2])  # 取第3行数据
print(a[:,3])  # 取第4列数据

"""
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
 
[ 3  9 15 21]
"""

2. 取多列

  • 语法:ndarrar.[:,start:end:step]

    • 前面的冒号表示所有行都要

    • 当需要多列中的每隔几列来取,就要用到 step 步长这个参数了

a = np.arange(24).reshape(4,6)
print(a)

# print(a[2])  # 取第3行数据
# print(a[:2])  # 取第1行到第2行,[...)与python的列表切片一样,左闭右开的区间
# print(a[1:2])  # 取第2行到第2行,左闭右开所以只取到第二行的数据

print(a[:,3])  # 取第4列数据,值得注意的是,当取出1列切片时,切片变形为1维数组
print(a[:,:3])  # 取第1列到第3列数据
print(a[:,1:3])  # 取第2到第3列数据

"""
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

[ 3  9 15 21]

[[ 0  1  2]
 [ 6  7  8]
 [12 13 14]
 [18 19 20]]

[[ 1  2]
 [ 7  8]
 [13 14]
 [19 20]]
"""

3. 取不连续多列

  • 语法:ndarrar.[:,[m,n,...]]
    • 前面的冒号表示所有行都要
a = np.arange(24).reshape(4,6)
print(a)

print(a[:,[0,2]])  # 取第1列 第3列

"""
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

[[ 0  2]
 [ 6  8]
 [12 14]
 [18 20]]
"""

三、同时取行和列

  • 语法:ndarrar.[start:end:step,start:end:step]
a = np.arange(24).reshape(4,6)
print(a)
print(a[:2,1:3])  # 取第1行到第2行,第2列到第3列数据

"""
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

[[1 2]
 [7 8]]
"""

四、取点

1. 取某一个点

  • 语法:ndarrar.[m,n,...]
    • 有几个维度中括号里就填几个值
a = np.arange(24).reshape(4,6)
print(a)
print(a[0,2])  # 取第1行的第3列

"""
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
 
2
"""

2. 取多个不相邻的点

  • 语法:ndarrar.[[m,n,...],[j,k,...],...]
    • 有几个维度,第1层中括号里就填几个中括号
    • 去几个点,最里层中括号里就填几个值
1. 二维数组
a = np.arange(24).reshape(4,6)
print(a)
print(a[[0,2],[1,3]])  # 取(0,1) (2,3) 2个坐标的点
print(a[[0,2,3],[1,3,5]])  # 取(0,1) (2,3) (3,5) 3个坐标的点

"""
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
 
[ 1 15]

[ 1 15 23]
"""

2. 三位数组
a = np.arange(48).reshape(2,4,6)
print(a)
print(a[[0,1,1],[0,2,1],[1,3,2]])  # 取(0,0,1) (1,2,3) (1,1,2) 3个坐标的点

"""
[[[ 0  1  2  3  4  5]
  [ 6  7  8  9 10 11]
  [12 13 14 15 16 17]
  [18 19 20 21 22 23]]

 [[24 25 26 27 28 29]
  [30 31 32 33 34 35]
  [36 37 38 39 40 41]
  [42 43 44 45 46 47]]]
  
[ 1 39 32]
"""

五、numpy中的布尔索引

  • 通过布尔索引,可以实现更为复杂的取值操作,会取出布尔值为true的值
  • 比如取出数组中所有小于5的值
a = np.arange(24).reshape(4,6)
print(a)
print('*' * 30)

print(a<3)  
print(a[a<3])

"""
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
 
[[ True  True  True False False False]
 [False False False False False False]
 [False False False False False False]
 [False False False False False False]]
 
[0 1 2]
"""
posted @ 2025-03-12 16:34  BigSun丶  阅读(101)  评论(0)    收藏  举报