numpy中对于tile的理解

近些天使用numpy的时候发现了这么一个函数tile,感觉这个函数比较有用,可以将减少循环,直接矩阵运算优化运算速度。博主认为很有必要认真讨论一下这个函数的功能。

官网解释

老传统,我们先看一下官网是怎么说的:
np.tile
相当于是一个复制函数,扩充矩阵的规模值直至到我们满意的一个形状。"tile"在英文中作动词会有“铺”的意思,与extend是同义词。
通过提供的次数reps来决定重复A的次数来构造一个array。
如果reps的长度为d,那么给出结果的维度就是max(d, A.ndim).

如果 A.ndim < d,则通过添加新轴将 A 提升为 d 维。 因此,将形状 (3,) 数组提升为 (1, 3) 以进行 2-D 复制,或将形状 (1, 1, 3) 提升为 (1, 1, 3) 以进行 3-D 复制。 如果这不是所需的行为,请在调用此函数之前手动将 A 提升到 d 维度。

如果 A.ndim > d,代表通过在它前面添加 1 被提升为 A.ndim。 因此,对于形状为 (2, 3, 4, 5) 的 A,(2, 2) 的重复次数被视为 (1, 1, 2, 2)。

最后注意一下:这里特意提到了虽然 tile 可以用于广播,但强烈建议使用 numpy 的广播操作和功能。

详细解析

我们首先来看几个简单例子:

a = np.array([0, 1, 2])
np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
np.tile(a, (2, 2))
array([[0, 1, 2, 0, 1, 2],
       [0, 1, 2, 0, 1, 2]])
np.tile(a, (2, 1, 2))
array([[[0, 1, 2, 0, 1, 2]],
       [[0, 1, 2, 0, 1, 2]]])

如代码所示,如果reps只是一个标量的话,我们仅需将其在矩阵内部加上赋值reps倍即可,而如果是矢量矩阵例如reps是(a, b, c)的话,我们需要在内部扩充c倍之后,将这一个整体矩阵看作是一个A然后他是形状为(a,b)里面的一个元素,这样的话我们就能够成功理解有关操作了。按照这个思路,我们看一下更加复杂的一些操作:

b = np.array([[1, 2], [3, 4]])
np.tile(b, 2)
array([[1, 2, 1, 2],
       [3, 4, 3, 4]])
np.tile(b, (2, 1))
array([[1, 2],
       [3, 4],
       [1, 2],
       [3, 4]])
np.tile(b, (3, 2))
array([[1, 2, 1, 2],
       [3, 4, 3, 4],
       [1, 2, 1, 2],
       [3, 4, 3, 4],
       [1, 2, 1, 2],
       [3, 4, 3, 4]])
np.tile(b, (3, 4, 2))
array([[[1, 2, 1, 2],
        [3, 4, 3, 4],
        [1, 2, 1, 2],
        [3, 4, 3, 4],
        [1, 2, 1, 2],
        [3, 4, 3, 4],
        [1, 2, 1, 2],
        [3, 4, 3, 4]],

       [[1, 2, 1, 2],
        [3, 4, 3, 4],
        [1, 2, 1, 2],
        [3, 4, 3, 4],
        [1, 2, 1, 2],
        [3, 4, 3, 4],
        [1, 2, 1, 2],
        [3, 4, 3, 4]],

       [[1, 2, 1, 2],
        [3, 4, 3, 4],
        [1, 2, 1, 2],
        [3, 4, 3, 4],
        [1, 2, 1, 2],
        [3, 4, 3, 4],
        [1, 2, 1, 2],
        [3, 4, 3, 4]]])

实际上最后一个便是我们所谓的广播操作,但是numpy官方并不希望我们利用这个函数来进行广播操作。
最后仍然放一些实例吧:

c = np.array([1,2,3,4])
np.tile(c,(4,1))
array([[1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4]])
b = np.random.randint(3, 29, 8).reshape(4, 2)
[[28 20]
 [27  8]
 [ 4 22]
 [23  8]]
np.tile(b, (2, 1))
array([[28, 20],
       [27,  8],
       [ 4, 22],
       [23,  8],
       [28, 20],
       [27,  8],
       [ 4, 22],
       [23,  8]])

参考文章

https://numpy.org/doc/stable/reference/generated/numpy.tile.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值