前言
本篇总结、介绍Numpy数组(ndarray)的基本操作之一——平铺数组 [1]。
1. tile
numpy.tile(A, reps):将A沿着指定的轴复制多次
- A:类数组。输入数组
- reps:类数组。指示A沿每个轴复制的次数
假设reps的长度为d,输入数据的维度为A.ndim,那么numpy.tile函数返回的数组的维度为max(d, A.ndim):
- 如果A.ndim<d,那么numpy.tile会为输入数组A添加新的轴,从而将A转换为d维数组。例如,形状为(N,)的数组A会被转化为(1,N)的2维数组、(1,1,N)的3维数组…
- 如果A.ndim>d,那么numpy.tile会在reps前面添加1,从而将reps转换为A.ndim维数组。例如,数组A的形状为(2,3,4,5),reps为(1,2),那么reps会被转换为(1,1,1,2),表示数组A在前三个轴上不进行复制,在第四个轴上复制2次
>>> arr = np.array([[0,1],[2,3]])
>>> arr
array([[0, 1],
[2, 3]])
>>> np.tile(arr,2)
array([[0, 1, 0, 1],
[2, 3, 2, 3]])
# 等同于
>>> np.tile(arr,(1,2))
array([[0, 1, 0, 1],
[2, 3, 2, 3]])
>>> np.tile(arr,(2,2))
array([[0, 1, 0, 1],
[2, 3, 2, 3],
[0, 1, 0, 1],
[2, 3, 2, 3]])
>>> np.tile(arr,(2,1,2))
array([[[0, 1, 0, 1],
[2, 3, 2, 3]],
[[0, 1, 0, 1],
[2, 3, 2, 3]]])
>>> np.tile(np.expand_dims(arr,axis=0),(2,1,2))
array([[[0, 1, 0, 1],
[2, 3, 2, 3]],
[[0, 1, 0, 1],
[2, 3, 2, 3]]])
注释:
如果numpy.tile返回的不是我们想要的结果,我们可以手动对A进行升维或降维。
2. repeat
numpy.repeat(a, repeats, axis=None):逐元素重复数组元素
- a:类数组。输入数组
- repeats:整数或整数序列。指示每个元素的重复次数,repeats会被广播从而适配给定轴(axis)的形状
- axis:整数或None,可选参数。指示沿着哪个轴复制数组元素
- None:输入数组会被展平,并返回展平的数组
>>> arr = np.array([[0,1],[2,3]])
>>> arr
array([[0, 1],
[2, 3]])
>>> np.repeat(arr,2) # arr会先被展平成array([0, 1, 2, 3]),2会被拓展为[2,2,2,2],以适配每个元素
array([0, 0, 1, 1, 2, 2, 3, 3])
>>> np.repeat(arr,[2,2,2,2]) # 该例清楚地表明2被拓展为了[2,2,2,2]
array([0, 0, 1, 1, 2, 2, 3, 3])
>>> np.repeat(arr,2,axis=0) # 2被拓展为[2,2]
array([[0, 1],
[0, 1],
[2, 3],
[2, 3]])
>>> np.repeat(arr,[1,2],axis=0)
array([[0, 1],
[2, 3],
[2, 3]])
>>> np.repeat(arr,2,axis=1) # 2被拓展为[2,2]
array([[0, 0, 1, 1],
[2, 2, 3, 3]])
>>> np.repeat(arr,[1,2],axis=1)
array([[0, 1, 1],
[2, 3, 3]])
>>> np.repeat(arr,2,axis=3) # numpy.repeat只能在已有的轴上进行元素复制
AxisError: axis 3 is out of bounds for array of dimension 2
>>> np.repeat(2,3) # 可以直接对输入的数复制多次
array([2, 2, 2])
注释:
注意numpy.tile和numpy.repeat的区别。