Numpy 数组中 reshape 和 resize 的区别
在使用 NumPy 数组时,常常需要对数组进行维度重组。在此过程中,我们经常会用到 reshape 和 resize。这两个函数都可以用来改变数组的形状,但是它们有着不同的用法和区别。本文将会详细探讨 reshape 和 resize 的区别。
阅读更多:Numpy 教程
数组的形状
在详细讨论 reshape 和 resize 的区别之前,我们需要了解一下数组的形状。NumPy 数组是由若干维构成的,每一维都有固定的长度。数组的形状可以用一个元组来描述,元组的长度即为数组的维数。例如,下面的代码创建了一个二维数组,并输出了它的形状:
输出结果为:
可以看出,a 是一个 3 × 4 的二维数组,其形状为 (3, 4)。当我们想要改变数组的形状时,就要使用 reshape 或 resize 函数了。
reshape 函数
reshape 函数可以用来改变数组的形状,其语法如下:
其中,a 是要重塑的数组,newshape 是一个整数或者一个表示新形状的元组,order 是可选参数,表示输出数组的存放顺序,默认为 C。
reshape 函数的返回值是数组的一个拷贝,它的形状和数据与原来的数组不同。
下面是一个例子,演示了如何使用 reshape 函数改变数组的形状:
输出结果为:
可以看出,一维数组 a 可以通过 reshape 函数重塑为一个 3 × 4 的二维数组。注意,我们在第三个例子中指定了 order=’F’,这意味着输出的数组中元素在内存中是以列优先的顺序存放的。这是因为在 NumPy 数组中,默认是以行优先顺序存放元素的。
需要注意的是,reshape 函数返回的是一个拷贝,原来的数组不会被改变。例如:
输出结果为:
可以看出,改变原数组 a 中的第一个元素并不会影响拷贝 b 的元素。
resize 函数
与 reshape 不同,resize 函数可以用来改变数组的形状和大小,其语法如下:
其中,a 是要重塑的数组,new_shape 是一个整数或者一个表示新形状的元组。
resize 函数的返回值是数组的一个拷贝,它的形状和数据与原来的数组不同。如果新数组的大小比原数组大,那么 resize 函数将重复原数组的元素,直到新数组的大小达到要求;如果新数组的大小比原数组小,那么 resize 函数将舍弃一些元素。
下面是一个例子,演示了如何使用 resize 函数改变数组的形状和大小:
输出结果为:
可以看出,resize 函数可以改变数组的大小,并可以根据需要重复或舍弃一些元素。例如,在第二个例子中,我们将一维数组 a 重塑为了一个 3 × 4 的二维数组,然后又用 resize 函数将其扩展为了一个 6 × 4 的二维数组,其中新数组的前三行和原数组相同,后三行是原数组的重复。在第三个例子中,我们将一维数组 a 重塑为了一个 5 × 4 的二维数组,然后又用 resize 函数将其缩小为了一个 2 × 2 的二维数组,其中新数组只包含最前面的四个元素。
需要注意的是,resize 函数返回的是一个拷贝,原来的数组不会被改变。与 reshape 不同,resize 函数可以改变数组的大小。如果新数组的大小比原数组大,那么 resize 函数将重复原数组的元素,直到新数组的大小达到要求;如果新数组的大小比原数组小,那么 resize 函数将舍弃一些元素。
输出结果为:
可以看出,当我们给 resize 函数传递一个整数作为 new_shape
参数时,其实是将数组重复多次来扩展数组的大小,或是截断数组来缩小数组的大小。
reshape 和 resize 的区别
我们已经了解了 reshape 和 resize 的用法和效果,下面我们来分析一下它们的区别。
reshape 和 resize 都可以用来改变数组的形状,但是它们的处理方式有所不同。reshape 函数总是返回一个与原数组形状不同的拷贝,不论新形状是否与原形状兼容。resize函数则可以根据需要扩展或缩小数组的大小,并可以在必要的时候重复或舍弃一些元素。
除此之外,reshape 和 resize 还有以下区别:
- reshape 不改变原数组的大小,也不改变元素的顺序和个数,只是改变了数组的形状,因此新数组的大小必须与原数组大小相同;resize 可以根据需要扩展或缩小数组的大小,新数组的大小可以比原数组大,也可以比原数组小。
- reshape 函数返回一个拷贝,原数组不会被改变,而 resize 返回的是一个重构后的数组,原数组可能会被改变。
- reshape 可以在赋值时用于改变数组的形状,例如 a.shape = (m, n),这意味着数组 a 的形状从原来的形状改变为 (m, n);但是 resize 函数不能用于赋值,它只能返回一个已经重构的数组。
总结
本文探讨了 reshape 和 resize 的区别,主要有以下几点:
- 数组的形状由一个元组来描述,元组的长度即为数组的维数。
- reshape 函数可以用来改变数组的形状,其返回一个与原数组形状不同的拷贝,不论新形状是否与原形状兼容。
- resize 函数可以用来改变数组的形状和大小,其返回一个重构后的数组,该数组可能是原数组的视图,也可能是拷贝。
- reshape 和 resize 的区别在于,reshape 不改变原数组的大小,只是改变了数组的形状,而 resize 可以根据需要扩展或缩小数组的大小。
结合这些知识,我们可以更好地利用 NumPy 提供的强大功能进行数组操作。