NumPy -数组索引与切片
数组索引与切片
目录
- 一维数组索引
- 多维数组索引
- 高级索引
- 布尔索引
- 花式索引
- 实际应用示例
一维数组索引
基本索引
import numpy as nparr = np.array([10, 20, 30, 40, 50])# 正索引
print(f"arr[0]: {arr[0]}")
print(f"arr[2]: {arr[2]}")
print(f"arr[-1]: {arr[-1]}") # 最后一个元素
print(f"arr[-2]: {arr[-2]}") # 倒数第二个元素
一维数组切片
import numpy as nparr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])# 基本切片
print(f"arr[2:5]: {arr[2:5]}") # [2 3 4]
print(f"arr[:5]: {arr[:5]}") # [0 1 2 3 4]
print(f"arr[5:]: {arr[5:]}") # [5 6 7 8 9]
print(f"arr[:]: {arr[:]}") # 全部元素# 带步长的切片
print(f"arr[::2]: {arr[::2]}") # [0 2 4 6 8]
print(f"arr[1::2]: {arr[1::2]}") # [1 3 5 7 9]
print(f"arr[::-1]: {arr[::-1]}") # 反转 [9 8 7 6 5 4 3 2 1 0]
print(f"arr[5:2:-1]: {arr[5:2:-1]}") # [5 4 3]
多维数组索引
二维数组索引
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(f"数组:\n{arr}")# 访问单个元素
print(f"\narr[0, 0]: {arr[0, 0]}") # 1
print(f"arr[1, 2]: {arr[1, 2]}") # 6
print(f"arr[-1, -1]: {arr[-1, -1]}") # 9# 访问整行
print(f"\narr[0]: {arr[0]}") # [1 2 3]
print(f"arr[1, :]: {arr[1, :]}") # [4 5 6]# 访问整列
print(f"\narr[:, 0]: {arr[:, 0]}") # [1 4 7]
print(f"arr[:, 2]: {arr[:, 2]}") # [3 6 9]
二维数组切片
import numpy as nparr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(f"数组:\n{arr}")# 行切片
print(f"\narr[0:2]:\n{arr[0:2]}")# 列切片
print(f"\narr[:, 1:3]:\n{arr[:, 1:3]}")# 行列同时切片
print(f"\narr[0:2, 1:3]:\n{arr[0:2, 1:3]}")# 步长切片
print(f"\narr[::2, ::2]:\n{arr[::2, ::2]}")
三维数组索引
import numpy as nparr = np.arange(24).reshape(2, 3, 4)
print(f"数组形状: {arr.shape}")
print(f"数组:\n{arr}")# 访问单个元素
print(f"\narr[0, 0, 0]: {arr[0, 0, 0]}")# 访问第一个二维数组
print(f"\narr[0]:\n{arr[0]}")# 访问所有第一行
print(f"\narr[:, 0, :]:\n{arr[:, 0, :]}")# 访问所有第一列
print(f"\narr[:, :, 0]:\n{arr[:, :, 0]}")
高级索引
整数数组索引
import numpy as nparr = np.array([10, 20, 30, 40, 50])# 使用整数数组索引
indices = np.array([0, 2, 4])
print(f"arr[{indices}]: {arr[indices]}")# 多维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(f"\n数组:\n{arr_2d}")# 选择特定行
rows = np.array([0, 2])
print(f"\n选择行 {rows}:\n{arr_2d[rows]}")# 选择特定行列组合
rows = np.array([0, 1])
cols = np.array([1, 2])
print(f"\n选择 (0,1) 和 (1,2):\n{arr_2d[rows, cols]}")
多维度整数数组索引
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(f"数组:\n{arr}")# 创建索引数组
rows = np.array([[0, 0], [2, 2]])
cols = np.array([[0, 2], [0, 2]])# 使用索引数组
result = arr[rows, cols]
print(f"\n索引结果:\n{result}")# 广播索引
rows = np.array([[0], [1], [2]])
cols = np.array([[0, 1, 2]])
result = arr[rows, cols]
print(f"\n广播索引结果:\n{result}")
布尔索引
基本布尔索引
import numpy as nparr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])# 创建布尔数组
mask = arr > 5
print(f"布尔掩码: {mask}")
print(f"满足条件的元素: {arr[mask]}")# 直接使用条件
print(f"\n大于5的元素: {arr[arr > 5]}")
print(f"偶数: {arr[arr % 2 == 0]}")
print(f"在3和8之间的元素: {arr[(arr > 3) & (arr < 8)]}")
多维数组布尔索引
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(f"数组:\n{arr}")# 创建布尔掩码
mask = arr > 5
print(f"\n布尔掩码:\n{mask}")# 使用掩码选择元素
print(f"\n大于5的元素: {arr[mask]}")# 条件修改
arr[arr > 5] = 0
print(f"\n修改后:\n{arr}")
多条件组合
import numpy as nparr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])# 使用 & (and) 和 | (or)
print(f"大于3且小于8: {arr[(arr > 3) & (arr < 8)]}")
print(f"小于3或大于8: {arr[(arr < 3) | (arr > 8)]}")# 使用 ~ (not)
mask = arr > 5
print(f"不大于5的元素: {arr[~mask]}")
花式索引
使用列表索引
import numpy as nparr = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])# 使用列表索引
indices = [0, 2, 5, 7]
print(f"使用列表索引: {arr[indices]}")# 多维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
print(f"\n数组:\n{arr_2d}")# 选择特定行
rows = [0, 2, 3]
print(f"\n选择行 {rows}:\n{arr_2d[rows]}")# 选择特定列
cols = [0, 2]
print(f"\n选择列 {cols}:\n{arr_2d[:, cols]}")
高级花式索引
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(f"数组:\n{arr}")# 选择对角线元素
diag_indices = [0, 1, 2]
print(f"\n对角线元素: {arr[diag_indices, diag_indices]}")# 选择特定位置的元素
rows = [0, 1, 2]
cols = [2, 1, 0]
print(f"\n选择 (0,2), (1,1), (2,0): {arr[rows, cols]}")# 使用 meshgrid 创建索引
rows, cols = np.meshgrid([0, 2], [1, 2])
print(f"\nrows:\n{rows}")
print(f"cols:\n{cols}")
print(f"结果:\n{arr[rows, cols]}")
实际应用示例
示例 1:数据筛选
import numpy as np# 创建学生成绩数据
scores = np.array([85, 92, 78, 96, 88, 75, 90, 87, 82, 95])
names = np.array(['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace', 'Henry', 'Ivy', 'Jack'])# 筛选高分学生(>90)
high_scores = scores > 90
print(f"高分学生:")
print(f"姓名: {names[high_scores]}")
print(f"成绩: {scores[high_scores]}")# 筛选中等成绩学生(80-90)
medium_scores = (scores >= 80) & (scores <= 90)
print(f"\n中等成绩学生:")
print(f"姓名: {names[medium_scores]}")
print(f"成绩: {scores[medium_scores]}")
示例 2:图像处理中的区域选择
import numpy as np# 模拟图像 (高度, 宽度)
image = np.random.randint(0, 255, size=(100, 100), dtype=np.uint8)
print(f"原始图像形状: {image.shape}")# 选择中心区域
center_y, center_x = 50, 50
radius = 20
y, x = np.ogrid[:100, :100]
mask = (x - center_x)**2 + (y - center_y)**2 <= radius**2# 提取圆形区域
circle_region = image[mask]
print(f"圆形区域元素数量: {len(circle_region)}")# 在掩码区域进行操作
image_masked = image.copy()
image_masked[mask] = 255 # 将圆形区域设为白色
示例 3:时间序列数据选择
import numpy as np# 创建时间序列数据
dates = np.arange('2024-01-01', '2024-12-31', dtype='datetime64[D]')
values = np.random.randn(len(dates)).cumsum() + 100# 选择特定月份的数据
january = dates[dates.astype('datetime64[M]') == np.datetime64('2024-01')]
january_values = values[dates.astype('datetime64[M]') == np.datetime64('2024-01')]print(f"1月份数据点数量: {len(january_values)}")# 选择特定条件的数据
high_values = values > values.mean() + values.std()
print(f"高于平均值+标准差的数据点数量: {high_values.sum()}")
总结
数组索引与切片要点:
- 基本索引:正索引和负索引
- 切片:start:stop:step 语法
- 多维索引:逗号分隔的索引
- 高级索引:整数数组索引
- 布尔索引:使用条件筛选
- 花式索引:使用列表或其他数组索引
