numpy中的tile函数网上讲解的有很多,但大概都是一带而过,这里参照官方文档进行一下说明。
def tile(A, reps):
“””
Construct an array by repeating A the number of times given by reps.
Ifreps
has lengthd
, the result will have dimension of
max(d, A.ndim)
.
IfA.ndim < d
,A
is promoted to be d-dimensional by prepending new
axes. So a shape (3,) array is promoted to (1, 3) for 2-D replication,
or shape (1, 1, 3) for 3-D replication. If this is not the desired
behavior, promoteA
to d-dimensions manually before calling this
function.
IfA.ndim > d
,reps
is promoted toA
.ndim by pre-pending 1’s to it.
Thus for anA
of shape (2, 3, 4, 5), areps
of (2, 2) is treated as
(1, 1, 2, 2).
Note : Although tile may be used for broadcasting, it is strongly
recommended to use numpy’s broadcasting operations and functions.
Parameters
———-
A : array_like
The input array.
reps : array_like
The number of repetitions ofA
along each axis.
Returns
——-
c : ndarray
The tiled output array.
说明
如果reps为元组时很容易把人弄糊涂,网上很多都只是简单说了一下按照维度进行复制,并没有仔细说明,这里详细说明一下。
对于tile(A, reps),首先要进行A的维度和reps的长度的比较,A的维度可以用第一个左中括号到第一个右中括号之间的“[”的数目进行判定,reps的长度可以用元组中元素的个数来确定,用A.ndim和d分别表示A的维度和reps的长度,返回的是一个max(A.ndim, d)维度的数组。
其次根据A.ndim和d的大小比较关系来进行具体的讨论:
A.ndim < d
:返回一个d维度的数组。因为A的维度不够,所以需要先对A进行维度的增加,简单来说就是在外面加中括号
。A的维度扩展到与d的大小相同后,以维度为单位进行复制。具体规则是:元组数字从右到左,数组维度从最深维度到最低维度。假设元组为(a,b,c,d,e,f),则数组最深维度重复f次;然后次深维度重复e次;接着次次深维度重复d次;再然后次次次深维度重复c次…… 以此类推,直到对最低维度重复a次,结束,得到结果。A.ndim > d
:返回一个与A形状相同的数组。因为d的长度不够,所以需要先对元组d左侧填入1
,当A,d维度相同后,再参照上面的规则进行复制。A.ndim = d
:从上面可以看到,当A.ndim != d时需要先让两者相等,然后再进行操作,再参照具体复制规则进行即可。
示例程序及讲解
# -*- coding: utf-8 -*-
import numpy as np
# A.ndim = d = 1, 最深维度里的内容是”0,1,2“,元组最右侧值是2,
# 将其”乘以“2次,感觉乘要比复制好记忆,结果是[0,1,2,0,1,2]
a = np.array([0, 1, 2])
arr = np.tile(a, 2)
print(np.array(arr))
# A.ndim < d:先对A增加维度,扩展成[[0,1,2]],然后最深层维度内容是”0,1,2“,d最右侧值是2,
#故结果为[[0,1,2,0,1,2]];
# 经过上一步操作后,A的次深层维度内容是”[0,1,2,0,1,2]“,元组d次右侧值为2,结果为
#[[0,1,2,0,1,2],[0,1,2,0,1,2]],可以一步步分开做,但不要忘记左右两侧的中
#括号,经过第一步就定下了维度,也就是中括号的数目和位置,
#这里用”,“做一下分隔,实际打印是换行效果
arr = np.tile(a, (2, 2))
print(np.array(arr))
# A.ndim=1, d=3,先对A扩维成[[[0,1,2]],最深层维度内容是”0,1,2“,d最右侧值是2,故结
#果为[[[0,1,2,0,1,2]]];然后次深维度内容为
# “[0,1,2,0,1,2]”,d次右侧值为1,结果为[[[0,1,2,0,1,2]]];
#A的第一维内容为”[[0,1,2,0,1,2]]“,d[0]为2,故结果为
# [[[0,1,2,0,1,2]],[[0,1,2,0,1,2]]]
arr = np.tile(a, (2, 1, 2))
print(np.array(arr))
# A.ndim=2, d=1,先对d左侧补1,即d变为(1,2)。A的最深维内容是”1,2”和“3,4“,d的最右侧值为2,对
#其分别进行”乘“操作,结果为[[1,2,1,2],[3,4,3,4]];A的次深维内容是”[1,2,1,2],[3,4,3,4]“,
#d次右侧值为1,故”乘1“之后结果为
# [[1,2,1,2],[3,4,3,4]]
b = np.array([[1, 2], [3, 4]])
arr = np.tile(b, 2)
print(np.array(arr))
总结
- tile函数使用的关键在于找准A的维度和reps的长度关系,然后扩展维度或增加元组长度,之后再像”剥洋葱“一样一层层的进行”复制“
- 对于初学者,使用numpy一定要有矩阵或者向量的概念,要以此为基本单位,这于我们普通的编程和所学的数学中具体到某个数字式不同的