【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.4 切片大师:高效操作多维数据的23个技巧
1.4 切片大师:高效操作多维数据的23个技巧
1.4 切片大师:高效操作多维数据的23个技巧
1.4.1 切片操作符的完整语法表
NumPy数组的切片操作符与标准Python列表的切片操作符类似,但更加强大,支持多维数组的操作。以下是一个完整的切片操作符语法表,包括正负索引的示意图。
1.4.1.1 一维数组切片
语法 | 说明 |
---|---|
a[start:stop] | 从索引start 到stop-1 的元素 |
a[start:stop:step] | 从索引start 到stop-1 ,每隔step 个元素 |
a[start:] | 从索引start 到数组末尾的元素 |
a[:stop] | 从数组开头到索引stop-1 的元素 |
a[:] | 全部元素 |
a[::step] | 全部元素,每隔step 个元素 |
a[::-1] | 反转数组 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
-11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
1.4.1.2 二维数组切片
语法 | 说明 |
---|---|
a[start, stop] | 选择第start 行,第stop 列 |
a[start:end, :] | 选择第start 到end-1 行,所有列 |
a[:, start:end] | 选择所有行,第start 到end-1 列 |
a[start1:end1, start2:end2] | 选择第start1 到end1-1 行,第start2 到end2-1 列 |
a[::step1, ::step2] | 每隔step1 行,每隔step2 列 |
a[::-1, ::-1] | 反转行和列 |
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | 0,0 | 0,1 | 0,2 | 0,3 | 0,4 |
1 | 1,0 | 1,1 | 1,2 | 1,3 | 1,4 |
2 | 2,0 | 2,1 | 2,2 | 2,3 | 2,4 |
3 | 3,0 | 3,1 | 3,2 | 3,3 | 3,4 |
4 | 4,0 | 4,1 | 4,2 | 4,3 | 4,4 |
1.4.1.3 三维数组切片
语法 | 说明 |
---|---|
a[start1:end1, start2:end2, start3:end3] | 选择第start1 到end1-1 行,第start2 到end2-1 列,第start3 到end3-1 页 |
a[::step1, ::step2, ::step3] | 每隔step1 行,每隔step2 列,每隔step3 页 |
a[::-1, ::-1, ::-1] | 反转行、列和页 |
0,0,0 | 0,0,1 | 0,0,2 | 0,1,0 | 0,1,1 | 0,1,2 | 0,2,0 | 0,2,1 | 0,2,2 | 0,3,0 | 0,3,1 | |
---|---|---|---|---|---|---|---|---|---|---|---|
1,0,0 | 1,0,0 | 1,0,1 | 1,0,2 | 1,1,0 | 1,1,1 | 1,1,2 | 1,2,0 | 1,2,1 | 1,2,2 | 1,3,0 | 1,3,1 |
2,0,0 | 2,0,0 | 2,0,1 | 2,0,2 | 2,1,0 | 2,1,1 | 2,1,2 | 2,2,0 | 2,2,1 | 2,2,2 | 2,3,0 | 2,3,1 |
3,0,0 | 3,0,0 | 3,0,1 | 3,0,2 | 3,1,0 | 3,1,1 | 3,1,2 | 3,2,0 | 3,2,1 | 3,2,2 | 3,3,0 | 3,3,1 |
1.4.2 负步长逆序切片的应用场景
负步长逆序切片在处理数组时非常有用,尤其是在你需要反转数组或从后向前取数据时。以下是一些常见的应用场景。
1.4.2.1 反转数组
import numpy as np
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])
# 使用负步长反转数组
reversed_arr = arr[::-1]
print(reversed_arr) # 输出: [5 4 3 2 1]
1.4.2.2 从后向前取部分数据
# 从后向前取最后3个元素
last_three = arr[-1:-4:-1]
print(last_three) # 输出: [5 4 3]
1.4.2.3 二维数组的逆序切片
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 反转行
reversed_rows = arr[::-1, :]
print(reversed_rows) # 输出: [[7 8 9] [4 5 6] [1 2 3]]
# 反转列
reversed_cols = arr[:, ::-1]
print(reversed_cols) # 输出: [[3 2 1] [6 5 4] [9 8 7]]
# 反转行和列
reversed_both = arr[::-1, ::-1]
print(reversed_both) # 输出: [[9 8 7] [6 5 4] [3 2 1]]
1.4.3 视图机制带来的副作用与防御方法
NumPy数组的切片操作返回的是原数组的视图(view),而不是副本。这意味着对视图的修改会直接影响到原数组。了解这一点非常重要,以便在编程时避免意外的副作用。
1.4.3.1 视图机制示例
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 切片操作返回视图
view = arr[0:2, 0:2]
print(view) # 输出: [[1 2] [4 5]]
# 修改视图
view[0, 0] = 10
print(arr) # 输出: [[10 2 3] [4 5 6] [7 8 9]]
1.4.3.2 防御方法:使用.copy()
创建副本
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 使用.copy()创建副本
copy = arr[0:2, 0:2].copy()
print(copy) # 输出: [[1 2] [4 5]]
# 修改副本
copy[0, 0] = 100
print(arr) # 输出: [[1 2 3] [4 5 6] [7 8 9]]
1.4.4 高维切片在图像处理中的应用
高维切片在图像处理中非常常见,尤其是处理多通道图像或体积数据(如MRI扫描)。以下是一个使用高维切片处理三维图像的示例。
1.4.4.1 3D数组切片示例
# 创建一个3D数组,模拟MRI数据
mri_data = np.random.rand(100, 100, 50)
# 选择一个特定的切片(第25页)
slice_25 = mri_data[:, :, 25]
print(slice_25.shape) # 输出: (100, 100)
# 选择一个特定的区域(前50行,前50列,最后30页)
region = mri_data[:50, :50, 20:]
print(region.shape) # 输出: (50, 50, 30)
1.4.4.2 可视化示例(使用Matplotlib)
import matplotlib.pyplot as plt
# 创建一个3D数组,模拟MRI数据
mri_data = np.random.rand(100, 100, 50)
# 选择一个特定的切片(第25页)
slice_25 = mri_data[:, :, 25]
# 可视化切片
plt.imshow(slice_25, cmap='gray')
plt.title('MRI Data Slice 25')
plt.colorbar()
plt.show()
1.4.5 修改切片视图影响原数组的警示案例
修改切片视图会直接影响原数组,这在某些情况下可能会导致意外的结果。以下是一个警示案例。
1.4.5.1 警示案例
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 切片操作返回视图
view = arr[0:2, 0:2]
# 修改视图
view[0, 0] = 100
# 检查原数组
print(arr) # 输出: [[100 2 3] [4 5 6] [7 8 9]]
1.4.6 使用slice对象的动态切片技巧
NumPy提供了slice
对象,可以动态地创建切片,这在处理复杂切片逻辑时非常有用。
1.4.6.1 示例:动态切片
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 使用slice对象创建切片
s = slice(0, 2)
# 动态应用切片
dynamic_slice = arr[s, s]
print(dynamic_slice) # 输出: [[1 2] [4 5]]
1.4.7 性能优化:避免大数组的连续切片
连续切片操作会带来性能开销,特别是在处理大数组时。了解如何优化切片操作可以显著提高代码的运行效率。
1.4.7.1 优化示例
# 创建一个大二维数组
large_arr = np.random.rand(10000, 10000)
# 不推荐的连续切片
start = 1000
end = 2000
slice1 = large_arr[start:end, :]
slice2 = slice1[:, start:end]
# 推荐的单次切片
optimized_slice = large_arr[start:end, start:end]
# 比较性能
import time
start_time = time.time()
_ = slice2
print(f"连续切片耗时: {time.time() - start_time:.6f}秒")
start_time = time.time()
_ = optimized_slice
print(f"单次切片耗时: {time.time() - start_time:.6f}秒")
1.4.8 切片语法的详细解析
1.4.8.1 一维数组切片解析
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])
# 从索引1到3的元素
result = arr[1:3]
print(result) # 输出: [2 3]
# 每隔2个元素
result = arr[::2]
print(result) # 输出: [1 3 5]
# 反转数组
result = arr[::-1]
print(result) # 输出: [5 4 3 2 1]
# 从索引3到末尾的元素
result = arr[3:]
print(result) # 输出: [4 5]
# 从开头到索引2的元素
result = arr[:2]
print(result) # 输出: [1 2]
# 全部元素
result = arr[:]
print(result) # 输出: [1 2 3 4 5]
1.4.8.2 二维数组切片解析
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 选择第0行,第1列
result = arr[0, 1]
print(result) # 输出: 2
# 选择第0到1行,所有列
result = arr[0:2, :]
print(result) # 输出: [[1 2 3] [4 5 6]]
# 选择所有行,第1到2列
result = arr[:, 1:2]
print(result) # 输出: [[2] [5] [8]]
# 选择第0到1行,第1到2列
result = arr[0:2, 1:2]
print(result) # 输出: [[2] [5]]
# 每隔一行,每隔一列
result = arr[::2, ::2]
print(result) # 输出: [[1 3] [7 9]]
# 反转行
result = arr[::-1, :]
print(result) # 输出: [[7 8 9] [4 5 6] [1 2 3]]
1.4.9 切片操作的高级案例
1.4.9.1 三维数据的动态切片
# 创建一个三维数组
arr = np.random.rand(10, 10, 10)
# 动态创建切片对象
s = slice(0, 5)
s2 = slice(2, 7)
s3 = slice(4, 9)
# 应用动态切片
dynamic_slice = arr[s, s2, s3]
print(dynamic_slice.shape) # 输出: (5, 5, 5)
1.4.9.2 使用布尔掩码进行切片
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 使用布尔掩码选择大于5的元素
mask = arr > 5
result = arr[mask]
print(result) # 输出: [6 7 8 9]
1.4.9.3 使用多个索引进行切片
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 使用多个索引选择特定的元素
indices = [0, 2]
result = arr[indices, indices]
print(result) # 输出: [1 9]
1.4.10 切片操作的高级应用
1.4.10.1 三维切片在视频处理中的应用
# 创建一个三维数组,模拟视频帧
video_frames = np.random.rand(100, 640, 480)
# 选取前50帧,中间的256x256区域
selected_frames = video_frames[:50, 192:448, 144:384]
print(selected_frames.shape) # 输出: (50, 256, 256)
# 可视化第一帧
plt.imshow(selected_frames[0], cmap='gray')
plt.title('Selected Video Frame 0')
plt.colorbar()
plt.show()
1.4.10.2 切片操作在图像处理中的应用
# 创建一个二维数组,模拟图像
image_data = np.random.rand(512, 512)
# 选取图像的中间256x256区域
center_region = image_data[128:384, 128:384]
print(center_region.shape) # 输出: (256, 256)
# 可视化中间区域
plt.imshow(center_region, cmap='gray')
plt.title('Center Region of Image')
plt.colorbar()
plt.show()
1.4.11 切片操作的性能优化
1.4.11.1 避免不必要的索引计算
在处理大数组时,避免不必要的索引计算可以显著提高性能。以下是一个具体的示例,展示了如何避免连续切片操作。
# 创建一个大二维数组
large_arr = np.random.rand(10000, 10000)
# 不推荐的连续切片
start = 1000
end = 2000
slice1 = large_arr[start:end, :]
slice2 = slice1[:, start:end]
# 推荐的单次切片
optimized_slice = large_arr[start:end, start:end]
# 比较性能
import time
start_time = time.time()
_ = slice2
print(f"连续切片耗时: {time.time() - start_time:.6f}秒")
start_time = time.time()
_ = optimized_slice
print(f"单次切片耗时: {time.time() - start_time:.6f}秒")
1.4.11.2 使用布尔掩码进行性能优化
布尔掩码可以避免创建不必要的中间数组,从而提高性能。特别是当处理大数组时,这种方法的优势更加明显。
# 创建一个大二维数组
large_arr = np.random.rand(10000, 10000)
# 使用布尔掩码选择大于0.5的元素
mask = large_arr > 0.5
result = large_arr[mask]
# 比较性能
start_time = time.time()
_ = result
print(f"布尔掩码切片耗时: {time.time() - start_time:.6f}秒")
1.4.11.3 使用视图机制进行性能优化
视图机制可以在不复制数据的情况下进行切片操作,这对于大数组来说非常有用。但需要注意,修改视图会影响原数组。
# 创建一个大二维数组
large_arr = np.random.rand(10000, 10000)
# 使用视图机制进行切片
view = large_arr[1000:2000, 1000:2000]
# 比较性能
start_time = time.time()
_ = view
print(f"视图切片耗时: {time.time() - start_time:.6f}秒")
1.4.12 切片操作的高级技巧总结
1.4.12.1 切片语法速查表
语法 | 说明 |
---|---|
a[start:stop] | 从索引start 到stop-1 的元素 |
a[start:stop:step] | 从索引start 到stop-1 ,每隔step 个元素 |
a[start:] | 从索引start 到数组末尾的元素 |
a[:stop] | 从数组开头到索引stop-1 的元素 |
a[:] | 全部元素 |
a[::step] | 全部元素,每隔step 个元素 |
a[::-1] | 反转数组 |
a[start1:end1, start2:end2] | 选择第start1 到end1-1 行,第start2 到end2-1 列 |
a[::step1, ::step2] | 每隔step1 行,每隔step2 列 |
a[::-1, ::-1] | 反转行和列 |
a[start1:end1, start2:end2, start3:end3] | 选择第start1 到end1-1 行,第start2 到end2-1 列,第start3 到end3-1 页 |
a[::step1, ::step2, ::step3] | 每隔step1 行,每隔step2 列,每隔step3 页 |
a[::-1, ::-1, ::-1] | 反转行、列和页 |
1.4.12.2 负步长逆序切片的应用场景
负步长逆序切片在以下场景中非常有用:
- 反转数组:将数组元素顺序完全反转。
- 从后向前取部分数据:选取数组的最后几部分数据。
- 对称操作:在处理对称数据时,可以方便地进行对称操作。
1.4.12.2.1 反转数组
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])
# 使用负步长反转数组
reversed_arr = arr[::-1]
print(reversed_arr) # 输出: [5 4 3 2 1]
1.4.12.2.2 从后向前取部分数据
# 从后向前取最后3个元素
last_three = arr[-1:-4:-1]
print(last_three) # 输出: [5 4 3]
1.4.12.2.3 对称操作
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 反转行
reversed_rows = arr[::-1, :]
print(reversed_rows) # 输出: [[7 8 9] [4 5 6] [1 2 3]]
# 反转列
reversed_cols = arr[:, ::-1]
print(reversed_cols) # 输出: [[3 2 1] [6 5 4] [9 8 7]]
# 反转行和列
reversed_both = arr[::-1, ::-1]
print(reversed_both) # 输出: [[9 8 7] [6 5 4] [3 2 1]]
1.4.12.3 视图机制带来的副作用与防御方法
视图机制在NumPy中非常高效,因为它不复制数据。但这也意味着对视图的修改会直接影响到原数组。了解这一点非常重要,以便在编程时避免意外的副作用。
1.4.12.3.1 视图机制示例
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 切片操作返回视图
view = arr[0:2, 0:2]
print(view) # 输出: [[1 2] [4 5]]
# 修改视图
view[0, 0] = 10
print(arr) # 输出: [[10 2 3] [4 5 6] [7 8 9]]
1.4.12.3.2 防御方法:使用.copy()
创建副本
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 使用.copy()创建副本
copy = arr[0:2, 0:2].copy()
print(copy) # 输出: [[1 2] [4 5]]
# 修改副本
copy[0, 0] = 100
print(arr) # 输出: [[1 2 3] [4 5 6] [7 8 9]]
1.4.13 高维切片在图像处理中的应用
高维切片在图像处理中非常常见,尤其是处理多通道图像或体积数据(如MRI扫描)。以下是一些具体的应用场景和示例。
1.4.13.1 3D数组切片示例
# 创建一个3D数组,模拟MRI数据
mri_data = np.random.rand(100, 100, 50)
# 选择一个特定的切片(第25页)
slice_25 = mri_data[:, :, 25]
print(slice_25.shape) # 输出: (100, 100)
# 选择一个特定的区域(前50行,前50列,最后30页)
region = mri_data[:50, :50, 20:]
print(region.shape) # 输出: (50, 50, 30)
1.4.13.1.1 可视化示例(使用Matplotlib)
import matplotlib.pyplot as plt
# 创建一个3D数组,模拟MRI数据
mri_data = np.random.rand(100, 100, 50)
# 选择一个特定的切片(第25页)
slice_25 = mri_data[:, :, 25]
# 可视化切片
plt.imshow(slice_25, cmap='gray')
plt.title('MRI Data Slice 25')
plt.colorbar()
plt.show()
1.4.13.2 切片操作在多通道图像处理中的应用
多通道图像(如RGB图像)通常是一个3D数组。以下是一个示例,展示了如何处理多通道图像。
# 创建一个3D数组,模拟RGB图像
image_data = np.random.rand(256, 256, 3) # 256x256图像,3个通道
# 选择红色通道
red_channel = image_data[:, :, 0]
print(red_channel.shape) # 输出: (256, 256)
# 选择绿色通道
green_channel = image_data[:, :, 1]
print(green_channel.shape) # 输出: (256, 256)
# 选择蓝色通道
blue_channel = image_data[:, :, 2]
print(blue_channel.shape) # 输出: (256, 256)
# 可视化各通道
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.imshow(red_channel, cmap='Reds')
plt.title('Red Channel')
plt.colorbar()
plt.subplot(1, 3, 2)
plt.imshow(green_channel, cmap='Greens')
plt.title('Green Channel')
plt.colorbar()
plt.subplot(1, 3, 3)
plt.imshow(blue_channel, cmap='Blues')
plt.title('Blue Channel')
plt.colorbar()
plt.show()
1.4.14 使用slice对象的动态切片技巧
NumPy提供了slice
对象,可以动态地创建切片,这在处理复杂切片逻辑时非常有用。
1.4.14.1 示例:动态切片
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 使用slice对象创建切片
s = slice(0, 2)
# 动态应用切片
dynamic_slice = arr[s, s]
print(dynamic_slice) # 输出: [[1 2] [4 5]]
1.4.14.2 动态切片在MRI数据处理中的应用
# 创建一个3D数组,模拟MRI数据
mri_data = np.random.rand(100, 100, 50)
# 动态创建切片对象
s1 = slice(0, 50)
s2 = slice(20, 70)
s3 = slice(10, 60)
# 应用动态切片
dynamic_slice = mri_data[s1, s2, s3]
print(dynamic_slice.shape) # 输出: (50, 50, 50)
# 可视化切片
plt.imshow(dynamic_slice[:, :, 25], cmap='gray')
plt.title('Dynamic MRI Data Slice 25')
plt.colorbar()
plt.show()
1.4.15 切片操作的高级性能优化
1.4.15.1 避免连续切片
连续切片操作会带来性能开销,特别是在处理大数组时。了解如何优化切片操作可以显著提高代码的运行效率。
1.4.15.1.1 优化示例
# 创建一个大二维数组
large_arr = np.random.rand(10000, 10000)
# 不推荐的连续切片
start = 1000
end = 2000
slice1 = large_arr[start:end, :]
slice2 = slice1[:, start:end]
# 推荐的单次切片
optimized_slice = large_arr[start:end, start:end]
# 比较性能
import time
start_time = time.time()
_ = slice2
print(f"连续切片耗时: {time.time() - start_time:.6f}秒")
start_time = time.time()
_ = optimized_slice
print(f"单次切片耗时: {time.time() - start_time:.6f}秒")
1.4.15.2 使用布尔掩码进行性能优化
布尔掩码可以避免创建不必要的中间数组,从而提高性能。特别是当处理大数组时,这种方法的优势更加明显。
1.4.15.2.1 优化示例
# 创建一个大二维数组
large_arr = np.random.rand(10000, 10000)
# 使用布尔掩码选择大于0.5的元素
mask = large_arr > 0.5
result = large_arr[mask]
# 比较性能
start_time = time.time()
_ = result
print(f"布尔掩码切片耗时: {time.time() - start_time:.6f}秒")
1.4.15.3 使用视图机制进行性能优化
视图机制可以在不复制数据的情况下进行切片操作,这对于大数组来说非常有用。但需要注意,修改视图会影响原数组。
1.4.15.3.1 优化示例
# 创建一个大二维数组
large_arr = np.random.rand(10000, 10000)
# 使用视图机制进行切片
view = large_arr[1000:2000, 1000:2000]
# 比较性能
start_time = time.time()
_ = view
print(f"视图切片耗时: {time.time() - start_time:.6f}秒")
1.4.16 总结
通过本文,我们详细介绍了NumPy切片操作的各种高级技巧和应用场景。以下是本文的主要内容总结:
- 切片语法速查表:提供了完整的切片操作符语法表,包括正负索引的示意图。
- 负步长逆序切片的应用场景:展示了负步长逆序切片在反转数组、从后向前取数据和对称操作中的应用。
- 视图机制带来的副作用与防御方法:解释了视图机制的原理,并提供了使用
.copy()
创建副本的方法来避免副作用。 - 高维切片在图像处理中的应用:通过3D数组和多通道图像的示例,展示了切片操作在图像处理中的应用。
- 性能优化:提供了避免连续切片、使用布尔掩码和视图机制的方法来优化切片操作的性能。
希望这些技巧和示例能帮助你在处理多维数据时更加高效和灵活。如果你有任何问题或需要进一步的解释,请随时在评论区留言。
参考资料
名称 | 链接 |
---|---|
NumPy官方文档 | https://numpy.org/doc/stable/ |
Python官方文档 | https://docs.python.org/3/library/functions.html#slice |
NumPy切片操作详解 | https://www.jb51.net/article/226629.htm |
NumPy数组视图和副本的区别 | https://www.geeksforgeeks.org/numpy-view-vs-copy/ |
切片操作的性能优化 | https://realpython.com/numpy-array-programming/ |
数组切片的高级用法 | https://towardsdatascience.com/how-to-slice-a-python-list-like-a-ninja-41d9a59df63f |
NumPy切片操作的常见陷阱 | https://numpy.org/doc/stable/user/basics.indexing.html |
使用布尔掩码进行切片 | https://numpy.org/doc/stable/user/basics.indexing.html#boolean-array-indexing |
动态切片的技巧 | https://numpy.org/doc/stable/reference/generated/numpy.s_.html |
切片操作在图像处理中的应用 | https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_core/py_image_operations/py_image_operations.html |
切片操作在视频处理中的应用 | https://scikit-image.org/docs/dev/user_guide/numpy_images.html |
切片操作在科学计算中的应用 | https://scientific-python.org/scientific-python-101/array-slicing/ |
NumPy数组操作的深入探讨 | https://www.numpy.org/devdocs/user/quickstart.html |
NumPy性能优化技巧 | https://scipy-cookbook.readthedocs.io/items/PerformanceTips.html |
NumPy切片操作的可视化示例 | https://matplotlib.org/stable/tutorials/index.html |
NumPy切片操作的详细原理 | https://docs.scipy.org/doc/numpy/user/basics.indexing.html |
这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)