您的位置:

np.reshape函数的详解

一、函数基本介绍

np.reshape函数是numpy库中的一个重要的函数,用于改变数组的形状,将一个数组变换为指定的大小。作用类似于resize,但会返回一个新的数组,而不是改变原数组的形状。

该函数有三个参数,分别是要变换的数组、目标形状以及一个可选参数。目标形状可以是一个整数、元组或列表,用于指定数组转换后的大小。可选参数为order,表示数组在内存中的存储方式,默认为'C',即按行排列。

    import numpy as np
    
    # 创建一个3x3的矩阵
    a = np.arange(9).reshape(3, 3)
    
    # 将其变换为一维数组
    b = a.reshape(9)
    
    # 输出变换后的结果
    print(b)

运行结果如下:

    [0 1 2 3 4 5 6 7 8]

二、改变数组的形状

np.reshape函数可以灵活地改变数组的形状,从而满足不同的需求。下面介绍几种典型的情况。

1、将一维数组变为矩阵

当我们有一个一维数组,需要将其变为矩阵时,可以使用reshape函数指定目标形状。因为矩阵的大小要满足行数和列数的乘积等于元素数量,所以目标形状需要满足这个条件。

    import numpy as np
    
    # 创建一个一维数组
    a = np.arange(9)
    
    # 将其变为3x3的矩阵
    b = a.reshape(3, 3)
    
    # 输出变换后的结果
    print(b)

运行结果如下:

    [[0 1 2]
     [3 4 5]
     [6 7 8]]

2、改变矩阵的行列

当我们需要改变一个矩阵的行列时,可以使用reshape函数指定目标形状,其中行数和列数可以交换。

    import numpy as np
    
    # 创建一个3x4的矩阵
    a = np.arange(12).reshape(3, 4)
    
    # 将其变为4x3的矩阵
    b = a.reshape(4, 3)
    
    # 输出变换后的结果
    print(b)

运行结果如下:

    [[ 0  1  2]
     [ 3  4  5]
     [ 6  7  8]
     [ 9 10 11]]

3、扁平化数组

当我们需要将一个多维数组变为一维数组时,可以使用reshape函数指定目标形状为-1。这样reshape函数会自动计算目标形状中的一个维度,使得改变后的数组为一维数组。

    import numpy as np
    
    # 创建一个2x3x4的三维数组
    a = np.arange(24).reshape(2, 3, 4)
    
    # 将其变为一维数组
    b = a.reshape(-1)
    
    # 输出变换后的结果
    print(b)

运行结果如下:

    [ 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.reshape函数默认按行排列数组元素,也就是按照内存中的存储方式。但是在一些应用场合下,我们需要按照列排列数组元素,或者按照其他方式排列。此时,可以使用可选参数order指定数组在内存中的存储方式。

1、按列排列数组元素

当我们需要按列排列数组元素时,可以使用order参数指定为'F'。

    import numpy as np
    
    # 创建一个3x3的矩阵
    a = np.arange(9).reshape(3, 3)
    
    # 按列排列数组元素
    b = a.reshape(9, order='F')
    
    # 输出变换后的结果
    print(b)

运行结果如下:

    [0 3 6 1 4 7 2 5 8]

2、按指定方式排列数组元素

当我们需要按照其他方式排列数组元素时,可以使用order参数指定为'default'、'C'或其他值。其中,'default'和'C'都表示按行排列数组元素。

    import numpy as np
    
    # 创建一个3x3的矩阵
    a = np.arange(9).reshape(3, 3)
    
    # 按指定方式排列数组元素
    b = a.reshape(9, order='default')
    
    # 输出变换后的结果
    print(b)

运行结果如下:

    [0 1 2 3 4 5 6 7 8]

四、应用举例

np.reshape函数在很多数据处理的场合都可以派上用场。下面介绍几种常见的应用场景。

1、图像处理

在图像处理中,需要将原始图像转换为一维向量进行处理,然后再将处理结果转换为图像进行显示。这时,就可以使用reshape函数实现转换。

    import cv2
    import numpy as np
    
    # 读取一张图像
    img = cv2.imread('test.jpg')
    
    # 将图像变为一维向量
    vec = img.reshape(-1)
    
    # 对向量进行处理
    vec /= 2
    
    # 将处理结果转换为图像
    img2 = vec.reshape(img.shape)
    
    # 显示图像
    cv2.imshow('img2', img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2、机器学习

在机器学习中,需要将原始数据转换为二维数组进行处理,然后再将处理结果转换为原始格式进行输出。这时,就可以使用reshape函数实现转换。

    import numpy as np
    
    # 读取原始数据
    data = np.loadtxt('data.txt')
    
    # 将数据变为2维数组
    X = data[:, :-1]
    y = data[:, -1]
    
    # 对数据进行处理
    ...
    
    # 将处理结果转换为原始格式
    data2 = np.concatenate((X, y.reshape(-1, 1)), axis=1)
    
    # 输出处理结果
    np.savetxt('data2.txt', data2, fmt='%.2f')

五、总结

通过本文的介绍,我们了解了np.reshape函数的基本用法和常见应用场景。该函数可以灵活地改变数组的形状,以适应不同的需求。同时,我们还学习了如何指定数组在内存中的存储方式,以及如何将数组与图像和机器学习数据进行转换。