前言
本篇总结、介绍Numpy数组(ndarray)的基本操作之一——重新排列元素 [1]。
1. flip、flipud、fliplr
numpy.flip(m, axis=None):沿给定轴(axis)翻转数组中元素的顺序。数组的形状被保留,但元素被重新排序
- m:类数组。操作对象
- axis:None、或整数、或整数序列,可选参数。指示沿其翻转的一个或多个轴
- None:沿输入数组所有的轴翻转数组
>>> arr = np.arange(8).reshape((2,2,2))
>>> arr
array([[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]])
>>> np.flip(arr,axis=0)
array([[[4, 5],
[6, 7]],
[[0, 1],
[2, 3]]])
>>> np.flip(arr,axis=1)
array([[[2, 3],
[0, 1]],
[[6, 7],
[4, 5]]])
>>> np.flip(arr,axis=2)
array([[[1, 0],
[3, 2]],
[[5, 4],
[7, 6]]])
>>> np.flip(arr,axis=[0,1])
array([[[6, 7],
[4, 5]],
[[2, 3],
[0, 1]]])
>>> np.flip(arr)
array([[[7, 6],
[5, 4]],
[[3, 2],
[1, 0]]])
numpy.fliplr(m):沿着轴-1翻转数组中元素的顺序(左右翻转)
- m:类数组。至少是2维数组
>>> arr1 = np.arange(8).reshape((2,4))
>>> arr1
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> np.fliplr(arr1)
array([[3, 2, 1, 0],
[7, 6, 5, 4]])
# 输入数组至少是2维的
>>> arr2 = np.array([0,1,2,3,4])
>>> np.fliplr(arr2)
ValueError: Input must be >= 2-d.
numpy.flipud(m):沿着轴-0翻转数组中元素的顺序(上下翻转)
>>> arr = np.arange(8).reshape((2,4))
>>> arr
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> np.flipud(arr)
array([[4, 5, 6, 7],
[0, 1, 2, 3]])
注释:
- flip(m,0)相当于flipud(m)
- flip(m,1)相当于fliplr(m)
- flip(m,n)相当于m[…,::-1,…],其中::-1对应n的位置/轴
- flip(m)相当于m[::-1,::-1,…,::-1]
- flip(m,(0,1))相当于m[::-1,::-1,…],其中::-1对应0和1的位置/轴
2. reshape
相关内容请参考 [2]。
3. roll
numpy.roll(a, shift, axis=None):沿给定的轴滚动数组元素,超出最后位置的元素将会滚动到第一个位置。即将a,沿着指定轴(axis)的方向,滚动指定长度(shift)
- a:类数组
- shift:整数或整数序列。元素滚动的长度或位数
- 如果是整数序列,那么axis参数也必须是相同大小的序列,表示每个轴axis上滚动的长度或位数
- 如果是整数,而axis参数是序列,表示在axis参数指定的每个轴上滚动相同的长度或位数
- axis:None、或整数、或整数序列,可选参数
- None:数组在移位之前会被展开,之后会恢复原始形状
>>> arr = np.arange(8).reshape((2,4))
>>> arr
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> np.roll(arr,1,axis=0)
array([[4, 5, 6, 7],
[0, 1, 2, 3]])
>>> np.roll(arr,1,axis=1)
array([[3, 0, 1, 2],
[7, 4, 5, 6]])
>>> np.roll(arr,1,axis=[0,1])
array([[7, 4, 5, 6],
[3, 0, 1, 2]])
>>> np.roll(arr,[1,2],axis=[0,1])
array([[6, 7, 4, 5],
[2, 3, 0, 1]])
>>> np.roll(arr,2)
array([[6, 7, 0, 1],
[2, 3, 4, 5]])
4. rot90
numpy.rot90(m, k=1, axes=(0, 1)):在指定平面内(axes)将数组m旋转90度
- m:类数组。维度需大于等于2维
- k:整数。数组旋转90度的次数
- axes:数组选择的平面
>>> arr = np.arange(24).reshape(2,3,4)
>>> arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
>>> np.rot90(arr,1,axes=(0,1))
array([[[ 8, 9, 10, 11],
[20, 21, 22, 23]],
[[ 4, 5, 6, 7],
[16, 17, 18, 19]],
[[ 0, 1, 2, 3],
[12, 13, 14, 15]]])
>>> np.rot90(arr,1,axes=(0,2))
array([[[ 3, 15],
[ 7, 19],
[11, 23]],
[[ 2, 14],
[ 6, 18],
[10, 22]],
[[ 1, 13],
[ 5, 17],
[ 9, 21]],
[[ 0, 12],
[ 4, 16],
[ 8, 20]]])
>>> np.rot90(arr,axes=(1,2))
array([[[ 3, 7, 11],
[ 2, 6, 10],
[ 1, 5, 9],
[ 0, 4, 8]],
[[15, 19, 23],
[14, 18, 22],
[13, 17, 21],
[12, 16, 20]]])
注释:
本篇中介绍的函数返回的都是原数组的视图。