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

numpy 中强大的 transpose() 、rollaxis()、swapaxes(),第1张

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5522154.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存