在NumPy里,我们能用多种方法来扩展数组,让它变得更大或者更复杂。举个例子,你想把一个数据结构重复几次,比如复制标签、扩展样本数据,或者构造一个测试矩阵,这时候就得用到数组重复和扩展操作了。这个过程跟变形数组不一样,有的是真的把元素或结构复制一遍,有的是通过广播机制假装数组变了个样。按照NumPy的规矩,这些操作主要分为三类:元素级的重复、结构级的复制,还有广播机制下的扩展。 先说元素级的重复,这个功能是靠repeat()函数实现的。它会把每个元素都按照你设定的次数重复一下。具体用法是numpy.repeat(a, repeats, axis=None)。这里面有三个参数,a是输入的数组,repeats是每个元素要重复的次数,可以是一个整数或者是一个序列。如果repeats是序列的话,这个序列的长度必须得跟指定轴上的元素个数一样多。axis参数就是指定沿着哪个轴去做这个重复操作。要是没给这个参数,那就是先把数组给拉成一维的,然后再重复。比如你有个一维数组a是[1, 2, 3],调用np.repeat(a, 2),输出就会变成[1, 1, 2, 2, 3, 3]。如果是二维数组的话,比如a是[[1, 2], [3, 4]],调用np.repeat(a, 2, axis=0),输出就是[[1, 2], [1, 2], [3, 4], [3, 4]]。这样沿着行方向每一行就都重复了一遍。 再来说结构级的复制,这个功能由tile()函数负责。它能按一定的模式把整个数组结构都复制一遍。用法是numpy.tile(A, reps)。A就是输入的数组,reps是你想在各个维度上复制多少次。这可以是一个整数或者整数序列。比如np.tile(a, 2),输出就是[1, 2, 3, 1, 2, 3],相当于把整个数组整个儿复制了两次。要是你想在两个维度上都复制的话,可以这样写np.tile(a, (2, 3)),输出就是[[1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3]]。如果输入的数组是三维的但reps的维度比它还长的话,NumPy会给它前面补充新的维度来对齐。比如np.tile(np.array([1, 2, 3]), (2, 2)),输出就会是[[1, 2, 3], [1, 2, 3]]。 repeat()和tile()都用来重复数组,但方式不一样:repeat()是在元素层面重复每个单个的元素;而tile()是在整体结构上一块块地复制。 最后说说广播机制下的扩展。这种扩展其实并没有真的复制数据,而是在视图上做文章。这里主要用到两个函数:broadcast_to()和broadcast_arrays()。broadcast_to()的作用是把数组按照广播规则扩展成指定的形状。用法是numpy.broadcast_to(array, shape)。这个shape必须得符合广播的规则,也就是从末尾维度开始对齐,要么相等要么是1。比如你有个一维数组a是[1, 2, 3],调用np.broadcast_to(a, (3, 3)),输出就是[[1, 2, 3], [1, 2, 3], [1, 2, 3]]。要注意返回的这个结果通常是个只读视图(writeable=False),不能直接修改里面的值。 broadcast_arrays()这个函数是用来处理多个数组的情况的,把它们都扩展成相同形状的视图。用法是numpy.broadcast_arrays(*arrays)。它会返回一个元组,里面装着扩展后的数组视图。这些结果通常共享底层的数据块,而不是单独复制出来的新数据。 总结一下NumPy提供了很多种方式来重复和扩展数组:repeat()用来复制单个元素;tile()用来复制整体结构;broadcast_to()和broadcast_arrays()则是利用广播机制在不实际复制数据的情况下改变数组的形状。这些操作覆盖了从“真的复制数据”到“只是扩展视图”的不同机制,在数据构造和向量化计算中非常有用。“点赞有美意,赞赏是鼓励”。