一、函数基本介绍
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函数的基本用法和常见应用场景。该函数可以灵活地改变数组的形状,以适应不同的需求。同时,我们还学习了如何指定数组在内存中的存储方式,以及如何将数组与图像和机器学习数据进行转换。