Numpy 数组中 reshape 和 resize 的区别

Numpy 数组中 reshape 和 resize 的区别

在使用 NumPy 数组时,常常需要对数组进行维度重组。在此过程中,我们经常会用到 reshape 和 resize。这两个函数都可以用来改变数组的形状,但是它们有着不同的用法和区别。本文将会详细探讨 reshape 和 resize 的区别。

阅读更多:Numpy 教程

数组的形状

在详细讨论 reshape 和 resize 的区别之前,我们需要了解一下数组的形状。NumPy 数组是由若干维构成的,每一维都有固定的长度。数组的形状可以用一个元组来描述,元组的长度即为数组的维数。例如,下面的代码创建了一个二维数组,并输出了它的形状:

import numpy as np

a = np.arange(12).reshape((3, 4))
print(a)
print(a.shape)
Python

输出结果为:

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

(3, 4)
Python

可以看出,a 是一个 3 × 4 的二维数组,其形状为 (3, 4)。当我们想要改变数组的形状时,就要使用 reshape 或 resize 函数了。

reshape 函数

reshape 函数可以用来改变数组的形状,其语法如下:

numpy.reshape(a, newshape, order='C')
Python

其中,a 是要重塑的数组,newshape 是一个整数或者一个表示新形状的元组,order 是可选参数,表示输出数组的存放顺序,默认为 C。

reshape 函数的返回值是数组的一个拷贝,它的形状和数据与原来的数组不同。

下面是一个例子,演示了如何使用 reshape 函数改变数组的形状:

import numpy as np

a = np.arange(12)
print(a)

b = np.reshape(a, (3, 4))
print(b)

c = np.reshape(a, (3, 4), order='F')
print(c)
Python

输出结果为:

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

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

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

可以看出,一维数组 a 可以通过 reshape 函数重塑为一个 3 × 4 的二维数组。注意,我们在第三个例子中指定了 order=’F’,这意味着输出的数组中元素在内存中是以列优先的顺序存放的。这是因为在 NumPy 数组中,默认是以行优先顺序存放元素的。

需要注意的是,reshape 函数返回的是一个拷贝,原来的数组不会被改变。例如:

import numpy as np

a = np.arange(12)
print(a)

b = np.reshape(a, (3, 4))
print(b)

a[0] = 100
print(a)
print(b)
Python

输出结果为:

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

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

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

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

可以看出,改变原数组 a 中的第一个元素并不会影响拷贝 b 的元素。

resize 函数

与 reshape 不同,resize 函数可以用来改变数组的形状和大小,其语法如下:

numpy.resize(a, new_shape)
Python

其中,a 是要重塑的数组,new_shape 是一个整数或者一个表示新形状的元组。

resize 函数的返回值是数组的一个拷贝,它的形状和数据与原来的数组不同。如果新数组的大小比原数组大,那么 resize 函数将重复原数组的元素,直到新数组的大小达到要求;如果新数组的大小比原数组小,那么 resize 函数将舍弃一些元素。

下面是一个例子,演示了如何使用 resize 函数改变数组的形状和大小:

import numpy as np

a = np.arange(12)
print(a)

b = np.resize(a, (3, 4))
print(b)

c = np.resize(a, (5, 4))
print(c)

d = np.resize(a, (2, 2))
print(d)
Python

输出结果为:

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

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

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

[[0 1]
 [2 3]]
Python

可以看出,resize 函数可以改变数组的大小,并可以根据需要重复或舍弃一些元素。例如,在第二个例子中,我们将一维数组 a 重塑为了一个 3 × 4 的二维数组,然后又用 resize 函数将其扩展为了一个 6 × 4 的二维数组,其中新数组的前三行和原数组相同,后三行是原数组的重复。在第三个例子中,我们将一维数组 a 重塑为了一个 5 × 4 的二维数组,然后又用 resize 函数将其缩小为了一个 2 × 2 的二维数组,其中新数组只包含最前面的四个元素。

需要注意的是,resize 函数返回的是一个拷贝,原来的数组不会被改变。与 reshape 不同,resize 函数可以改变数组的大小。如果新数组的大小比原数组大,那么 resize 函数将重复原数组的元素,直到新数组的大小达到要求;如果新数组的大小比原数组小,那么 resize 函数将舍弃一些元素。

import numpy as np

a = np.arange(4)
print(a)

b = np.resize(a, 8)
print(b)

c = np.resize(a, 2)
print(c)
Python

输出结果为:

[0 1 2 3]

[0 1 2 3 0 1 2 3]

[0 1]
Python

可以看出,当我们给 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 提供的强大功能进行数组操作。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册