NumPy的函数手册里提到,数组拆分这事儿在数据分析、科学计算和机器学习里可常见了。除了把几个数组拼起来,咱们还经常需要把一个大数组切成好几块。比如说把数据集分成训练集和测试集,按列划分特征,或者按批次分割数据,还有就是把大数组切开来让电脑能并行处理。NumPy给咱们提供了一整套专门干这事的函数,不过要注意,这些函数返回的子数组通常是原来数组的视图,修改子数组往往会直接影响原数组。 按功能来分,常用的拆分函数大致分这几类:一种是等分拆分,一种是不等分拆分,还有就是按方向拆分的接口。咱们先说说等分拆分,split()函数可以把数组沿着指定的轴平均分成几份。严格意义上的等分,那得能整除才行,不能随便切。它会把分好的子数组打包成一个列表返回。 具体的用法是numpy.split(ary, indices_or_sections, axis=0)。这里的参数意思很简单:ary就是要处理的输入数组;indices_or_sections决定怎么切——如果是个数组或者列表,那里面放的就是切分点的位置;axis是说沿着哪条轴切,默认是0。 举个例子,要是想用份数来切,就像np.split(a, 3),它就会给你把a数组分成等长的3份。这里要注意,如果用整数份数切的话,数组的长度必须能被整除,否则程序会报错。如果用索引位置来切,比如np.split(a, [2,4]),那就相当于从索引2开始切一刀,到索引4再切一刀。Python的切片规则是左闭右开区间,所以切分点[2,4]表示a[4:]就是[5,6]。还有一种情况是切分点超出了数组边界,比如np.split(a,[2,10]),这时候程序不会报错,而是会返回空的数组段。 接着是不等分拆分,用array_split()这个函数就行。这个更灵活,不用非得平均分也能切。用法跟split差不多,numpy.array_split(ary, indices_or_sections, axis=0)。比如np.array_split(a,3),它就会按照3个位置来切分,不管能不能整除都能分。可能前面的子数组稍微长点。 再来说说按方向拆分的接口,这其实是在split()的基础上包了一层皮。hsplit()是按列来拆的(轴是1),vsplit()是按行来拆的(轴是0),dsplit()是按第三轴来拆的(轴是2)。 hsplit()对二维及以上数组来说就是split(axis=1),对一维数组来说就是split(axis=0)。比如对一个形状是(1,4,2)的数组A做np.hsplit(A,2),结果就是把A沿列分成了两部分。 vsplit()需要输入至少是二维的数组,否则会报错。它也会把数组分成几部分后返回列表。比如对刚才那个A做np.vsplit(A,2),结果就分成了两行。 dsplit()要求输入至少是三维的数组才能用。比如对那个形状为(1,4,2)的A做np.dsplit(A,2),它就会沿着第三轴切成两份。这里面A.shape是(1,4,2),切完后每份的形状就是(1,4,1)。这个功能在处理图像通道的时候特别有用,因为图像通道通常就是第三轴那个位置。 最后总结一下:NumPy的这套拆分函数体系里,split()用来严格平均切分;array_split()用来灵活切分;hsplit()、vsplit()和dsplit()则是专门用来按列、按行或者第三轴方向进行切分的操作。需要注意的是不同的函数在是否要求能整除、拆哪条轴以及输入的维度上有不同要求,具体用的时候得根据数据结构和任务需要来选最合适的函数。