numpy 中强大的 transpose() 、rollaxis()、swapaxes()

在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中对多维数组的旋转轴操作,实在是太方便了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值