Numpy Flatten和Ravel有何区别

Numpy Flatten和Ravel有何区别

在numpy中,flatten和ravel都是用于将多维数组打平转化为一维数组的函数,但是它们在实现方式和一些细节上有所不同。本文将详细介绍flatten和ravel的使用方法及其区别。

阅读更多:Numpy 教程

flatten函数

flatten函数返回的是数组的一个拷贝,将数组上所有的维度展开成一维后输出。例如:

>>> import numpy as np
>>> a = np.array([[1, 2], [3, 4]])
>>> a.flatten()
array([1, 2, 3, 4])

上面的代码将一个二维数组a展开成了一个一维数组。由于返回的是数组的一份拷贝,所以如果对展开后的数组进行修改,不会对原数组产生影响:

>>> b = a.flatten()
>>> b[0] = 100
>>> print(a)
[[1 2]
 [3 4]]

可以发现,对展开后的数组的修改并没有改变原数组的值。这是由于展开后的数组是原数组的一份拷贝,与原数组并没有关联。

ravel函数

ravel函数也是将多维数组打平成一维数组,但是返回的是原数组的一个视图,也就是说,会影响原数组。例如:

>>> a = np.array([[1, 2], [3, 4]])
>>> b = a.ravel()
>>> print(b)
[1 2 3 4]
>>> b[0] = 100
>>> print(a)
[[100   2]
 [  3   4]]

可以看到,对ravel得到的一维数组进行修改,原数组a也发生了改变。这是由于ravel返回的是原数组的一个视图,也就是指向原数组相同的内存空间,通过修改视图中的值,就可以改变原数组中相应的值。

另外需要注意的是,当数组本身就是一维数组时,ravel并不会返回数组的拷贝,而是返回原数组的视图。例如:

>>> a = np.array([1, 2, 3, 4])
>>> b = a.ravel()
>>> b[0] = 100
>>> print(a)
[100   2   3   4]

可以看到,当原数组为一维数组时,ravel函数返回的仍然是原数组的视图。

总结

总的来说,flatten和ravel函数都可以将多维数组打平为一维数组,但是flatten返回的是数组的一份拷贝,修改它不会影响原数组,而ravel返回的是原数组的视图,对它进行修改会改变原数组中相应的值。因此,如果需要修改打平后的一维数组,应当使用ravel函数,如果不需要修改,则可以使用flatten函数。还需要特别注意的是,当原数组本身就是一维数组时,ravel返回的仍然是原数组的视图。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程