reshape
函数是 NumPy 库中一个非常有用的函数,它允许你将一个数组重新排列成一个新的形状,而不改变其数据。
1.基本语法
numpy.reshape(a, newshape, order='C')
a
:要重新排列的数组。newshape
:整数或整数元组的数组的新形状。在整数元组中,一个维度的大小可以是-1
,这表示该维度的大小将自动计算,以便保持数组中元素的总数不变。order
:{‘C’, ‘F’, ‘A’},可省略。控制读取元素时使用的内存顺序。'C' 表示按行优先(C风格),'F' 表示按列优先(Fortran风格),'A' 表示如果a
是Fortran数组,则使用Fortran风格,否则使用C风格。默认为 'C'。
2.实例分析
import numpy as np
x = np.linspace(0, 10, 20) + np.random.randn(20)
print(x) # 打印20个数据一维数组
print(x.shape)
print(x.reshape(-1, 1)) # 将数组x,变为一个20行1列的二维数组
print(x.reshape(-1, 1).shape)
print(x.reshape(1, -1)) # 将数组x,变为一个1行20列的二维数组
print(x.reshape(1, -1).shape)
print(x.reshape(-1, 5)) # 将数组x,变为5列的二维数组,因为数据是20个,自然有4行
print(x.reshape(-1, 5).shape)
print(x.reshape(10, -1)) # 将数组x,变为10行的二维数组,因为数据是20个,自然有2列
print(x.reshape(10, -1).shape)
x = np.linspace(0, 10, 20) + np.random.randn(20)
我们首先使用numpy
库生成了一个包含20个元素的一维数组x
,这些元素是在0到10之间均匀分布的线性空间点(通过np.linspace(0, 10, 20)
)上加上了一些随机噪声(通过np.random.randn(20)
)。
打印x
的形状:
print(x.shape)
输出为(20,)
,表示x
是一个一维数组,包含20个元素。
将x
重塑为20行1列的二维数组:
print(x.reshape(-1, 1))
-1
在reshape
方法中是一个占位符,表示该维度的大小是自动计算的,以便保持数组中元素的总数不变。这里,-1
被替换为20(因为x
有20个元素),所以输出是一个20行1列的二维数组。
打印重塑后数组的形状:
print(x.reshape(-1, 1).shape)
输出为(20, 1)
,表示这是一个20行1列的二维数组。
将x
重塑为1行20列的二维数组:
print(x.reshape(1, -1))
这里,第一个维度被明确设置为1,-1
则自动计算为20,以保持元素总数不变。所以输出是一个1行20列的二维数组。
打印重塑后数组的形状:
print(x.reshape(1, -1).shape)
输出为(1, 20)
,表示这是一个1行20列的二维数组。
将x
重塑为5列的二维数组:
print(x.reshape(-1, 5))
因为x
有20个元素,所以自动计算出有4行(-1
被替换为4)以满足5列的要求。
打印重塑后数组的形状:
print(x.reshape(-1, 5).shape)
输出为(4, 5)
,表示这是一个4行5列的二维数组。
3.注意事项
-
元素总数必须保持不变:重塑后的数组必须包含与原始数组相同数量的元素。如果尝试重塑成不同数量的元素,NumPy 将抛出
ValueError
。 -
-1
的使用:在newshape
中,你可以将一个维度指定为-1
,NumPy 将自动计算这个维度的大小,以保持元素总数不变。但是,你只能将一个维度指定为-1
。 -
返回新数组:
reshape
函数返回的是原数组的一个新视图(如果可能的话),但在某些情况下(特别是当无法以兼容的步长创建视图时),它可能会返回原始数据的副本。然而,无论哪种情况,原始数组都不会被修改。