官方说明看了许久才弄懂,在此记录下。
用法:
numpy.tile(A, reps)
其中,A为要复制的数组,reps是一个元组tuple,表复制的层次和次数 ,函数返回一个数组。
简言之,就是把数组沿各个方向复制,但遵循一定规则。
规则:
1. A的维度小于reps的元素数
例如A是2维,reps=(a,b,c,d,e),那么复制的步骤是先把A的维度扩展到和reps相同的维度,然后按照reps中数字从右向左的顺序依次复制相应次数内部内容。
from numpy import *
a = array([[1, 2], [3, 4]])
print('A数组的内容:\n', a)
print('数组的形状:\n', a.shape)
print('数组的维度:\n', a.ndim)
b = tile(a, (1, 2, 3))
print('复制后数组的内容:\n', b)
print('复制后数组的形状:\n', b.shape)
print('复制后数组的维度:\n', b.ndim)
A数组的内容:
[[1 2]
[3 4]]
数组的形状:
(2, 2)
数组的维度:
2
复制后数组的内容:
[[[1 2 1 2 1 2]
[3 4 3 4 3 4]
[1 2 1 2 1 2]
[3 4 3 4 3 4]]]
复制后数组的形状:
(1, 4, 6)
复制后数组的维度:
3
2. A的维度等于reps的元素数
该情况不需要扩充A的维度,直接复制即可。
from numpy import *
a = array([[1],[2]])
print('A数组的内容:\n', a)
print('数组的形状:\n', a.shape)
print('数组的维度:\n', a.ndim)
b = tile(a, (1, 2))
print('复制后数组的内容:\n', b)
print('复制后数组的形状:\n', b.shape)
print('复制后数组的维度:\n', b.ndim)
A数组的内容:
[[[1 2]
[3 4]
[5 6]]]
数组的形状:
(1, 3, 2)
数组的维度:
3
复制后数组的内容:
[[[1 2 1 2 1 2]
[3 4 3 4 3 4]
[5 6 5 6 5 6]
[1 2 1 2 1 2]
[3 4 3 4 3 4]
[5 6 5 6 5 6]]]
复制后数组的形状:
(1, 6, 6)
复制后数组的维度:
3
3. A的维度大于reps的元素数
该情况扩充reps,在reps的左边补上1,如A为3维,reps=(3,2),则补充reps为(1,3,2),然后按照上面的情况进行复制。
from numpy import *
a = array([[[1, 2],[3,4],[5,6]]])
print('A数组的内容:\n', a)
print('数组的形状:\n', a.shape)
print('数组的维度:\n', a.ndim)
b = tile(a, (2, 3))
print('复制后数组的内容:\n', b)
print('复制后数组的形状:\n', b.shape)
print('复制后数组的维度:\n', b.ndim)
A数组的内容:
[[[1 2]
[3 4]
[5 6]]]
数组的形状:
(1, 3, 2)
数组的维度:
3
复制后数组的内容:
[[[1 2 1 2 1 2]
[3 4 3 4 3 4]
[5 6 5 6 5 6]
[1 2 1 2 1 2]
[3 4 3 4 3 4]
[5 6 5 6 5 6]]]
复制后数组的形状:
(1, 6, 6)
复制后数组的维度:
3
与广播机制的联系:
例1:
import numpy as np
# a.shape=(2,2,3,4)
a = np.arange(1,49).reshape((2,2,3,4))
# b.shape=(3,4)
b = np.arange(1,13).reshape((3,4))
# numpy会将b.shape调整至(2,2,3,4), 这一步相当于numpy自动实现np.tile(b,[2,2,1,1])
res = a + b
print('a ===================================')
print(a)
print(a.shape)
print('b ===================================')
print(b)
print(b.shape)
print('res ===================================')
print(res)
print(res.shape)
print('a+b ===================================')
print(a+b == a + np.tile(b,[2,2,1,1]) )
print('===================================')
c = np.tile(b,[2,2,1,1])
print(c)
print(c.shape)
a ===================================
[[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[13 14 15 16]
[17 18 19 20]
[21 22 23 24]]]
[[[25 26 27 28]
[29 30 31 32]
[33 34 35 36]]
[[37 38 39 40]
[41 42 43 44]
[45 46 47 48]]]]
(2, 2, 3, 4)
b ===================================
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
(3, 4)
res ===================================
[[[[ 2 4 6 8]
[10 12 14 16]
[18 20 22 24]]
[[14 16 18 20]
[22 24 26 28]
[30 32 34 36]]]
[[[26 28 30 32]
[34 36 38 40]
[42 44 46 48]]
[[38 40 42 44]
[46 48 50 52]
[54 56 58 60]]]]
(2, 2, 3, 4)
a+b ===================================
[[[[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]]]
[[[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]]]]
===================================
[[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]]
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]]]
(2, 2, 3, 4)
例2:
a = np.arange(12).reshape(4,3)
# b.shape=(4,1)
b = np.arange(4).reshape(4,1)
# numpy会将b.shape调整至(4,3), 这一步相当于numpy自动实现np.tile(b,[1,3])
res = a + b
print('===================================')
print(a)
print(a.shape)
print('===================================')
print(b)
print(b.shape)
print('===================================')
print(res)
print(res.shape)
print('===================================')
print((a+b == a + np.tile(b,[1,3])) ) # 打印结果都是True
===================================
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
(4, 3)
===================================
[[0]
[1]
[2]
[3]]
(4, 1)
===================================
[[ 0 1 2]
[ 4 5 6]
[ 8 9 10]
[12 13 14]]
(4, 3)
===================================
[[ True True True]
[ True True True]
[ True True True]
[ True True True]]
例3:
a = np.arange(1,37).reshape((1,9,4))
# b.shape=(15,1,4)
b = np.arange(1,61).reshape((15,1,4))
res = a + b
print('===================================')
# print(a)
print(a.shape)
print('===================================')
# print(b)
print(b.shape)
print('===================================')
# print(res)
print(res.shape)
print('===================================')
q = np.tile(a,[15,1,1]) + np.tile(b,[1,9,1])
print(q == res) # 打印结果都是True
===================================
(1, 9, 4)
===================================
(15, 1, 4)
===================================
(15, 9, 4)
===================================
[[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]
[ True True True True]]]
部分内容参考自:numpy中tile()函数的功能分析_xiangz201的博客-CSDN博客_numpy.tile()