numpy.tile()函数说明
这个函数的作用是把数组沿各个方向复制,我这里不用x轴、y轴之类的说法,用中括号的位置来说明。当参数只有一个数字的时候,这个函数会将数组最里面的中括号的内容在中括号里面扩展复制。看代码就能明白:
ar = np.array([1,2,3])
print(ar)
print(np.tile(ar,0))
print(np.tile(ar,1))
print(np.tile(ar,2))
输出为:
[1 2 3]
[]
[1 2 3]
[1 2 3 1 2 3]
当只有一个参数为且0的时候,会清空,1不复制,2则复制了一个,所以中括号内一共两个。
当有两个参数的时候,例如(2,1)则1是针对最里面的中括号里面的,即最里面的维度,而2 是针对倒数第二层的维度进行复制:
ar2 = np.array([[1,2,3],[4,5,6]])
print(ar2)
print('-'*20)
print(np.tile(ar2,(2,1)))
print('-'*20)
print(np.tile(ar2,(2,2)))
输出为:
[[1 2 3]
[4 5 6]]
--------------------
[[1 2 3]
[4 5 6]
[1 2 3]
[4 5 6]]
--------------------
[[1 2 3 1 2 3]
[4 5 6 4 5 6]
[1 2 3 1 2 3]
[4 5 6 4 5 6]]
可以看到,对于二维数组,(2,1)没有复制最里面中括号的内容,只复制了倒数第二次中括号里面的内容。
需要注意的是,对于一维数组,(2,1)会将数组升为二维,因为它对最里层中括号不复制,而最里层中括号外进行复制,因此会将一个一维数组复制成两个一维数组,变成一个二维数组:
ar = np.array([1,2,3])
print(ar)
print('-'*20)
print(np.tile(ar,(2,1)))
输出为:
[1 2 3]
--------------------
[[1 2 3]
[1 2 3]]
还需要注意的是,当你的参数只有一个的时候,不管带不带括号,如2和(2),效果都是一样的,都只在最里层的中括号内复制:
ar = np.array([1,2,3])
print(ar)
print('-'*20)
print(np.tile(ar,2))
print('-'*20)
print(np.tile(ar,(2)))
print('-'*20)
ar2 = np.array([[1,2,3],[4,5,6]])
print(ar2)
print('-'*20)
print(np.tile(ar2,2))
print('-'*20)
print(np.tile(ar2,(2)))
输出为:
[1 2 3]
--------------------
[1 2 3 1 2 3]
--------------------
[1 2 3 1 2 3]
--------------------
[[1 2 3]
[4 5 6]]
--------------------
[[1 2 3 1 2 3]
[4 5 6 4 5 6]]
--------------------
[[1 2 3 1 2 3]
[4 5 6 4 5 6]]
所以当你参数再进行增加的时候,如(2,1,1),这种是针对二维及以上的数组,第一个2表示复制倒数第三层中括号的内容,当数组是二维数组就会复制成两个二维数组,变成一个三维数组;2后面的第一个1表示倒数第二层中括号里面的内容不变,第二个1表示倒数第一层中括号里的内容即最里层中括号的内容也不变:
ar3 = np.random.randint(10,size = (2,3,4))
print(ar3)
print('-'*20)
print(np.tile(ar3,(2,1,1)))
输出为:
[[[7 5 5 8]
[0 8 3 6]
[9 3 2 7]]
[[0 3 0 3]
[6 1 9 2]
[9 4 9 1]]]
--------------------
[[[7 5 5 8]
[0 8 3 6]
[9 3 2 7]]
[[0 3 0 3]
[6 1 9 2]
[9 4 9 1]]
[[7 5 5 8]
[0 8 3 6]
[9 3 2 7]]
[[0 3 0 3]
[6 1 9 2]
[9 4 9 1]]]
可以看到只将倒数第三层中括号里的内容进行了复制。