目录
一、数组拼接:vstack 与 hstack 的 “对齐秘诀”
三、元素增删:append 与 delete 的 “小心思”
今天感觉自己像个 “数组外科医生”—— 对着 NumPy 数组切切补补,居然也玩出了章法。晚上在 PyCharm 里复盘,从数组拼接时的 “对齐术” 到切割时的 “精准刀”,踩了几个小坑,也攒了些实用技巧,索性写成笔记,给同样在 NumPy 里打转的小伙伴参考~
一、数组拼接:vstack 与 hstack 的 “对齐秘诀”
拼接数组时,最开始总搞不懂 “为什么有时候能拼,有时候会报错”。直到在 PyCharm 里调了几组代码,才发现核心是 “形状对齐”。
1、垂直堆叠(vstack):上下对齐看行数
垂直堆叠就像 “把两个数组上下摞起来”,要求它们的列数必须相同。比如 PPT 里的例子,2 行 5 列的数组a
和 2 行 5 列的数组b
,用vstack
拼完直接变成 4 行 5 列:
import numpy as np
a = np.arange(10).reshape(2, -1) # 2行5列:[[0-4], [5-9]]
b = np.repeat(1, 10).reshape(2, -1) # 2行5列:[[1,1,1,1,1], [1,1,1,1,1]]
stacked_v = np.vstack((a, b))
print("垂直拼接后形状:", stacked_v.shape) # 输出(4,5)
在 PyCharm 里运行时,我特意在变量面板里对比了a
和b
的shape
—— 都是(2,5)
,列数一致,难怪能拼。后来故意把b
改成 3 列,PyCharm 直接标红报错 “ValueError: all the input array dimensions for the concatenation axis must match exactly”,这下印象深刻了。
2、水平堆叠(hstack):左右对齐看列数
水平堆叠则是 “左右并排”,要求行数必须相同。还是用上面的a
和b
,换hstack
试试:
stacked_h = np.hstack((a, b))
print("水平拼接后形状:", stacked_h.shape) # 输出(2,10)
PyCharm 的调试面板里,stacked_h
的每一行都是a
的行加b
的行,比如第一行是[0,1,2,3,4,1,1,1,1,1]
,一目了然。
二、数组切割:split 的 “精准刀法”
如果说拼接是 “做加法”,那split
就是 “做减法”。但切割比拼接更考验 “分寸感”,尤其是多维数组。
1、一维数组切割:按数量或位置
对一维数组x = np.arange(12)
切割,有两种方式:
(1)按数量平均切:np.split(x, 3)
会切成 3 个等长的子数组(各 4 个元素);
(2)按位置切:np.split(x, [2,5])
会在索引 2 和 5 的位置切,得到[0-1]、[2-4]、[5-11]
。
我在 PyCharm 里用print
输出结果时,发现子数组都是numpy.ndarray
类型,不是列表,这点和 Python 自带的切割不太一样。
2、二维数组切割:指定 “轴” 很关键
二维数组切割要加axis
参数:axis=0
是横向切(按行),axis=1
是纵向切(按列)。比如 3 行 4 列的数组:
x = np.arange(12).reshape(3,4)
# 按行切成3份(每份1行)
split_row = np.split(x, 3, axis=0)
# 按列切成2份(每份2列)
split_col = np.split(x, 2, axis=1)
在 PyCharm 里调试时,我盯着split_row
的每个子数组 ——[[0,1,2,3]]
、[[4,5,6,7]]
、[[8,9,10,11]]
,突然明白 “横向切” 就是把每行拆成独立数组。
三、元素增删:append 与 delete 的 “小心思”
给数组加元素或删元素,看着简单,实则藏着 “是否改变原数组” 的坑。
1、append:默认 “摊平” 数组,指定轴才保留维度
append
函数默认会把数组摊平成一维,比如给 2 行 3 列的数组a
加元素[7,8,9]
:
a = np.array([[1,2,3], [4,5,6]])
print(np.append(a, [7,8,9])) # 输出[1,2,3,4,5,6,7,8,9](一维)
如果想保留二维,必须加axis
参数。比如沿行添加(axis=0
),要保证列数和原数组一致:
print(np.append(a, [[7,8,9]], axis=0)) # 变成3行3列
我一开始漏了[[ ]]
,写成[7,8,9]
,PyCharm 报错 “ValueError: all the input arrays must have same number of dimensions”,原来加二维数组时要保持嵌套结构。
2、delete:删行删列看 axis,默认也摊平
delete
和append
类似,不加axis
会摊平。比如删 3 行 4 列数组的第 2 列(索引 1):
x = np.arange(12).reshape(3,4)
print(np.delete(x, 1, axis=1)) # 删掉第2列,变成3行3列
在 PyCharm 里对比删除前后的x.shape
,从(3,4)
变成(3,3)
,一目了然。
四、PyCharm 里的 “避坑神器”
学这些操作时,PyCharm 帮我少走了很多弯路:
1、实时形状提示:输入arr.shape
时,PyCharm 会自动显示数组的维度,拼接前看一眼,避免形状不匹配;
2、报错定位准:比如hstack
时行数不一致,报错信息直接指向 “dimension mismatch”,比课本上的文字描述直观;
3、变量面板可视化:调试时点开数组变量,能看到每个元素的位置,切割和拼接后的数据变化一目了然。
五、今天的 “顿悟” 时刻
最开始学vstack
和hstack
时,总记混哪个是行哪个是列。后来在 PyCharm 里画了个示意图:
1、vstack
的 “v” 像 “vertical(垂直)”,上下堆 → 行数变多;
2、hstack
的 “h” 像 “horizontal(水平)”,左右拼 → 列数变多。
还有append
加axis
的坑,其实和拼接一样:想沿行加,就保证列数匹配;想沿列加,就保证行数匹配。道理相通,只是函数不同而已。
六、最后:从 “不敢下手” 到 “大胆操作”
以前看到数组操作就发怵,总怕搞错维度。今天在 PyCharm 里反复试错,发现这些函数的逻辑其实很统一 —— 无非是 “按轴操作”“形状对齐”。下次再遇到新函数,先在 PyCharm 里建个小例子跑跑,看形状怎么变,元素怎么动,慢慢就有感觉了。
如果你也在学数组操作,不妨试试 “写一行代码,看一次形状,调一次变量”—— 抽象的规则,在代码跑起来的那一刻,突然就清晰了。
(欢迎评论区分享你切割数组时的 “精准刀法” 呀~)