Numpy之repeat、tile用法总结

本文总结了Numpy中的repeat和tile函数用法。repeat函数可以扩充数组元素,降低数组维度,当axis=None时,多维数组变为一维并扩充元素;axis=M时,在轴M上扩充。以3维数组为例,讲解了repeat的不同使用场景,包括在不同轴上重复元素。tile函数则是整体数组重复指定次数,与repeat在重复方式上有别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

repeat函数的作用:①扩充数组元素 ②降低数组维度

numpy.repeat(a, repeats, axis=None):若axis=None,对于多维数组而言,可以将多维数组变化为一维数组,然后再根据repeats参数扩充数组元素;若axis=M,表示数组在轴M上扩充数组元素。

下面以3维数组为例,了解下repeat函数的使用方法:

In [1]: import numpy as np

In [2]: arr = np.arange(12).reshape(1,4,3)

In [3]: arr
Out[3]:
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]]])
①repeats为整数N,axis=None:数组arr首先被扁平化,然后将数组arr中的各个元素 依次重复N次
In [4]: arr.repeat(2)
Out[4]:
array([ 0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  7,  8,
        8,  9,  9, 10, 10, 11, 11])
②repeats为整数数组rp_arr,axis=None:数组arr首先被扁平化,然后再将数组arr中元素依次重复对应rp_arr数组中元素对应次数。若rp_arr为一个值的一维数组,则数组arr中各个元素重复相同次数,否则rp_arr数组长度必须和数组arr的长度相等,否则报错

a:rp_arr为单值一维数组,进行广播

In [5]: arr.repeat([2])
Out[5]:
array([ 0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  7,  8,
        8,  9,  9, 10, 10, 11, 11])
b:rp_arr长度小于数组arr长度,无法进行广播,报错
In [6]: arr.repeat([2,3,4])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-6-d3b52907284c> in <module>()
----> 1 arr.repeat([2,3,4])

ValueError: operands could not be broadcast together with shape (12,) (3,)
c:rp_arr长度和数组arr长度相等
In [7]: arr.repeat(np.arange(12))
Out[7]:
array([ 1,  2,  2,  3,  3,  3,  4,  4,  4,  4,  5,  5,  5,  5,  5,  6,  6,
        6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,
        8,  8,  9,  9,  
`torch.tile` 和 `torch.repeat` 都是用来对张量进行复制操作的功能,但在使用上有一些细微的区别。 ### `torch.repeat` 这个函数会按照指定的次数沿每个维度重复元素。它的语法如下: ```python torch.repeat(input, sizes) ``` 其中 `sizes` 是一个整数元组 `(d0, d1, ..., dn)` ,表示沿着每一个维度需要重复多少次。 **注意点:** - 如果输入是一个形状为 `[a, b]` 的二维张量,并且你想将其按行和列都扩展三倍,则可以这样调用 `repeat(3, 3)` - 这种方式可能会导致内存占用增加,因为它是通过实际拷贝数据的方式来进行扩张 #### 示例代码: ```python import torch x = torch.tensor([[1, 2], [3, 4]]) print(x.repeat(2, 1)) # 输出结果: # tensor([[1, 2], # [3, 4], # [1, 2], # [3, 4]]) ``` ### `torch.tile` 此功能更类似于 NumPy 中的 tile 操作,它直接将整个数组作为一个整体单位,在各个方向平铺若干份而不改变其内部结构顺序。 语法形式同 repeat 类似, ```python torch.tile(input, dims) ``` 但是这里的参数dims通常不会单独针对某几个轴设置特定值,而是倾向于统一处理所有维度或者保持原始尺寸不变地简单复制粘贴整个矩阵。 例如对于大小为[a,b]的一个二维array来说如果我们想得到的结果仍然是先连续排列原来的两个完整array然后再往下堆叠这样的效果的话就适合采用tile()方法来完成任务. 此外需要注意的是pytorch版本>=1.8才支持该api. #### 示例代码: ```python y = torch.tensor([1, 2]) z = y.tile((2,)) print(z) # 结果应该是: # tensor([1, 2, 1, 2]) ``` 从性能上看两者并没有本质区别;选择哪一个取决于具体需求——如果你希望控制每条轴线具体的扩增比例那么就应该选用`.repeat()`而如果仅仅只是单纯地把原图象做周期性的延展则推荐利用`.tile()`更为简洁明了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值