在numpy中,有三个方法对数组进行维度的变换,非常的强大,简直太酷了。
1. transpose() 翻转数组的维度顺序
意思是,假设有个3维数组,array[x][y][z],x,y,z是他的三个维度,那么翻转后就变成了 array[z][y][x]。我们用代码测试一下:
import numpy as np
data = [[[1,2,3],[4,5,6],[7,8,9]],
[[11,22,33],[44,55,66],[77,88,99]],
[[111,222,333],[444,555,666],[777,888,999]],
[[1111,2222,3333],[4444,5555,6666],[7777,8888,9999]]
]
ndarray = np.array(data)
ndarray 打印出来是这样的:
array([[[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9]],
[[ 11, 22, 33],
[ 44, 55, 66],
[ 77, 88, 99]],
[[ 111, 222, 333],
[ 444, 555, 666],
[ 777, 888, 999]],
[[1111, 2222, 3333],
[4444, 5555, 6666],
[7777, 8888, 9999]]])
执行 ndarray.transpose(), 打印出来是这样的:
array([[[ 1, 11, 111, 1111],
[ 4, 44, 444, 4444],
[ 7, 77, 777, 7777]],
[[ 2, 22, 222, 2222],
[ 5, 55, 555, 5555],
[ 8, 88, 888, 8888]],
[[ 3, 33, 333, 3333],
[ 6, 66, 666, 6666],
[ 9, 99, 999, 9999]]])
我们用下面的代码实现一下,就很好理解了。
nda1 = numpy.zeros((3,3,4), dtype=numpy.int32)
"""
这里为什么是 (3,3,4),是因为原数组是 (4, 3, 3). transpose 翻转,就是把维度的顺序反过来。
"""
for z in range(3):
for y in range(3):
for x in range(4):
nda1[z,y,x] = ndarray[x,y,z]
打印 nda1 ,你会发现输出的结果就是 transpose() 后的样子。这是就是翻转
2. rollaxis(arr, axis, start) 将数组arr所对应的axis轴 放在 start轴的前面,start轴往后移一“列”
意思是,假设还是有个3维数组,array[x][y][z],rollaxis(array, z, x) -> array[z][x][y]
我们可以列出3维数组的所有可能:
rollaxis(array, x, x) -> array[x][y][z]
rollaxis(array, x, y) -> array[x][y][z]
rollaxis(array, x, z) -> array[y][x][z]
rollaxis(array, y, x) -> array[y][x][z]
rollaxis(array, y, y) -> array[x][y][z]
rollaxis(array, y, z) -> array[x][y][z]
rollaxis(array, z, x) -> array[z][x][y]
rollaxis(array, z, y) -> array[x][z][y]
rollaxis(array, z, z) -> array[x][y][z]
我们还是用代码实现一下:rollaxis(array, 2, 0) -> array[z][x][y],看看是否正确
# 注意 原数组是 (4, 3, 3),新的结构就是(3,4,3)
nda2 = numpy.zeros((3,4,3), dtype=numpy.int32)
for z in range(3):
for x in range(4):
for y in range(3):
nda2[z,x,y] = ndarray[x,y,z]
我们可打印出来:nda2 的值 和 numpy.rollaxis(ndarray, 2, 0) 是一样的。
3. swapaxes(arr, axis1, axis2) 交换数组的两个轴
这个就比较好理解了。我们用代码实现一下,交换一下 x 轴和 z 轴
# 注意 原数组是 (4, 3, 3),交换后的新的结构就是(3,3,4)
nda3 = numpy.zeros((3,3,4), dtype=numpy.int32)
for z in range(3):
for y in range(3):
for x in range(4):
nda3[z,y,x] = ndarray[x,y,z]
打印出 nda3 的值,看看是不是和 np.swapaxes(ndarray, 0, 2) 是一样的。
确实,numpy中对多维数组的旋转轴操作,实在是太方便了。