
上次笔记,完成了第十六章:Numpy数组的规整,包括了解reshape()函数,以及理解一维数组转换为行列向量、二维数组的操作。今天继续学习第十六章,继续探索数组的一些变化操作,具体内容包括列举如下;并尝试在每一个小节后面,用括号表示本小节最重要的一个或多个语句,以便分析和回顾:
16.4 一维数组➡️三维数组
16.5 视图vs副本
16.6 转置
--
16.4 一维数组➡️三维数组(numpy.reshape(a, (x, y, z)))
a = np.arange(-13, 13+1)np.reshape(a, (3, 3, 3)) # 通过设置reshape()参数,将一维数组“a”转化为三个➕三行➕三列的三维数组
运行截图:


--
16.5 视图vs副本(numpy.shares_memory())
1️⃣之前的笔记中已知:
1. “视图(view)”是一个数组的不同视角或表现方式,与原始数组共享同一个内存,因此对视图进行操作时,会影响原始数据。
2. “副本(copy)”是对一个数组的完全复制,相当于“另存为”,不与原始数据共享内存,因此操作副本时不会影响原始数据。
在对数组的操作中,使用以下关键代码np.shares_memory(),分别传递数组A和B,判断两个数字是否指向同一个内存:
np.shares_memory('数组a', '数组b')具体操作如下:

2️⃣【重点】上次笔记已经学过了reshape的操作,现在结合“视图”和“副本”讲解它们合起来应用的区别。
1. 首先给出书上的示例代码:

这段示例代码没有前因后果,我看得很吃力,并且书本上的解释比较模糊,因此我用“太奶奶”的人设,请ai帮我解释:

2. 为什么要先验证是否处于“同一个内存”(“是否来自同一个锅”)?
2-1. 反面例子:没有验证内存的情况下,本来只想改动部分,却影响了整体:

2-2. 正面例子:先使用“np.shares_memory()”验证内存,防止意外。验证内存的关键代码:
# 使用np.shares_memory()函数(最直接)print("np.shares_memory(大盘菜, 小碗1):", np.shares_memory(大盘菜, 小碗1)) # True
2-3 如果需要修改,使用.copy()创建副本,避免影响原来的数据:
# 1. 创建原数据原数据 = np.array([...])# 2. 提取数据时明确标注数据_只读 = 原数据[:] # 假设是只读视图数据_可修改 = 原数据[:].copy() # 明确创建副本用于修改# 3. 重要数据总使用副本重要数据备份 = 原数据.copy()
3️⃣综上,这部分内容的重点,应该是强调实际应用中,检查数组是否在同一内存的重要性,以免出错(感觉这个可以成为编程必须做的“检查清单”之一)。
--
16.6 转置(numpy.transpose())
1️⃣一维数组的转置:还是其本身
书本给出以下数组,根据ai提示,可以用np.swapaxes()验证一维数组的转置:

示例代码:
# 给定的数组arr_1d = np.array([-7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7])print("原始一维数组:")print(arr_1d)print("形状:", arr_1d.shape) # (15,)print("维度数:", arr_1d.ndim) # 1# 尝试在一维数组上使用 swapaxestry:result = np.swapaxes(arr_1d, 0, 0) # 甚至交换同一个轴print("swapaxes(0,0) 结果:", result)except Exception as e:print(f"错误: {type(e).__name__}: {e}")# 结果:不报错,显示“arr_1d”本身
示例代码中,通过最后一行语句不难看到,一维数组的转置是其本身,这是因为一维数组只有一个轴,转置操作不会改变数组的形状。一维数组的形状是(n,),它没有行和列的概念,转置操作对一维数组没有意义。因此,一维数组的转置返回的是原始数组的视图,不会改变任何东西。
书本再次给到了两个案例的转置示例(关键代码:np.transpose()):只有一行的一维数组,和只有一列的一维数组。
1. 只有一行的一维数组:

2. 只有一列的一维数组:

2️⃣二维数组的转置:
1. 回顾第十六章笔记,有以下二维数组“A_3_by_5”:


2. 使用".T"属性(效果与np.transpose一致),将其转置,并可视化:
关键代码(非常简洁,就一句话):
# 二维数组的转置A_3_by_5_T = A_3_by_5.T
运行结果:

3. 使用np.transpose()作为关键代码,将这个二维数组进行转置,并输出最终结果(结合上一小节关于视图和副本的区别应用):
# 视图 vs 副本# 定义一个二维数组arr = np.array([[1, 2, 3], [4, 5, 6]])# 使用.transpose()方法得到数组的转置arr_transpose = arr.transpose()# 使用.T属性得到数组的转置arr_T = arr.T# 修改新数组中的元素arr_transpose[0, 1] = 100arr_T[2, 0] = 200# 输出结果print("原始数组:")print(arr)print("使用.transpose()方法得到的数组的转置:")print(arr_transpose)print("使用.T属性得到的数组的转置:")print(arr_T)

⬆️关于以上三个数组,有很重要的一点需要强调:
arr:原本的数组
arr_transpose:通过np.transpose()转置后的数组,与“arr”完全一致。
arr.T:是np.transpose()属性的简写,作用与np.transpose()完全一致,得到的数组也与“arr”完全一致。
以上三个数组,内存都指向同一地方,都同为“视图”,与“副本”有本质的区别。
--
今天是大年初二,一有时间就打开电脑敲笔记。
今天学的有点慢,有点散,归根结底,我认为是没有按照“先看视频,理解后再看书”的步骤,自己硬着头皮去理解,就比较吃力。
还是要多优化路径,减少耗损,长期坚持。
--
笔记写于:2026年2月18日21:38:41
结束于:2026年2月18日23:08:44
用时:一个半小时
--