本教程将告诉你如何使用Numpy ravel函数。它将解释该函数的语法,并向你展示如何使用Numpy ravel来平整一个数组。
下面是一个内容表。如果你正在寻找特定的东西,你可以点击任何一个链接,跳到相应的章节。
目录:
说了这么多, 如果你是Numpy的新手, 我建议你阅读整个教程.
Numpy Ravel的快速介绍
让我们首先快速浏览一下Numpy ravel函数的作用。
Numpy ravel将一个Numpy数组或类似的Python对象平铺出来。
说白了:这和Numpy的flatten方法非常相似,后者也是将Numpy数组压平。
为了理解我所说的 "压平 "Numpy数组是什么意思,让我们快速回顾一下Numpy数组的形状。
对Numpy数组和数组 "形状 "的快速回顾
你可能记得,Numpy数组是Python中的一种特殊结构,它以行和列的格式保存数字数据。
Numpy数组可以有不同的 "形状"
Numpy数组可以以一维、二维或多维的形式存在。 它们有点像数学中的向量和张量。
下面是一个一维数组的例子。
这里是一个二维数组的例子。
你会注意到,这两个数组中的值都是一样的,但 "形状 "不同。
在一个数组中,所有的值都排列在一个 "行 "中(尽管一维数组是一个特例,从技术上讲,这并不完全是一个行)。
而在另一个数组中,数值被排列成一个两行三列的结构。
为什么数组的形状很重要
数组的形状很重要,因为Numpy和Python中的不同操作要求Numpy数组具有特定的形状。
例如,当我们用Scikit Learn进行机器学习时,大部分的输入数组需要是2维的形状。
然而,在其他情况下,我们有时需要将数组 "拉平 "成一维的形状。
这经常发生在更高级的数据处理中,我们需要首先将一个数组压平,然后以某种方式进一步处理它。
最终,你需要工具来重塑和平整数组,这就是Numpy ravel的作用。
说了这么多,让我们来看看Numpy ravel的语法。
Numpy Ravel的语法
在这里,我们将看一下Numpy ravel函数的语法。
我将解释高层次的语法,并详细解释一些重要的参数。
关于导入Numpy的一个简单说明
只是简单提醒一下关于使用Numpy的问题。
每当我们在Python中使用Numpy时,我们首先需要将Numpy导入我们的环境。
通常的惯例是用别名 "np
, " 来导入Numpy,使用这个代码。
import numpy as np
你在本教程中看到的所有语法和代码都将假定你是这样导入Numpy的。
Numpy Ravel语法
Numpy ravel函数的语法相当简单。
你以np.ravel()
的方式调用该函数。
在括号内,你必须提供一个类似数组的对象或你想操作的类似数组对象的名称。
还有一个可选的参数,即order
参数,我们将在本篇文章后面讨论。
所以我们假设你有一个名为my_array
的二维Numpy数组。
为了使这个数组扁平化,你可以输入np.ravel(my_array)
,这将产生一个具有相同元素的一维数组。
我们将在例子部分更详细地研究这个例子(以及其他一些例子)。
Numpy ravel的参数
ravel函数只有一个参数:order
参数。
让我们快速看一下它。
order
(可选)
order
参数允许你指定数值在扁平化的输出数组中出现的顺序。
换句话说,它控制了函数如何将数值重组为一维形状。
这个参数的两个可能的参数是。
order = 'C'
order = 'F'
这个参数是可选的,所以如果你不使用它,它将自动默认为order = 'C'
。
让我们来看看这个参数的两个设置。
命令 = 'C
如果你设置了order = 'C'
,那么ravel函数将按照行的第一顺序将元素平铺出来。
顺便提一下,这被称为'C
' 顺序,因为在C语言编程中,数据就是这样被存储和检索的。
记住:这是Numpy ravel的默认行为,所以如果你决定不明确使用该参数,该函数将自动以行先的顺序平铺你的数组。
order = 'F
如果你把这个参数设置为order = 'F'
,ravel函数将以列先的顺序将元素压平。
这被称为'F
' 顺序,因为这就是Fortran编程语言存储和检索数据的方式。
Numpy Ravel的输出
Numpy Ravel函数返回一个一维的扁平化数组,该数组的元素与输入的元素相同(根据order
参数排序,如上所述)。
重要的是, ravel函数返回一个对原始输入数组的视图。 这是一个微妙的技术要点,我将在例子5中解释。
如何使用Numpy Ravel的例子
现在我们已经研究了Numpy ravel的语法,让我们看看几个例子。
例子。
首先运行这段代码来导入Numpy
在我们运行这些例子之前,我们首先要导入Numpy。
要导入Numpy,你需要运行这段代码。
import numpy as np
如前所述,这使我们能够访问Numpy命名空间中的函数,并允许我们用前缀 "np
"来调用它们(这是Numpy用户的共同约定)。
运行这段代码来创建一个二维数组
现在,我们要创建一个二维的Numpy数组,我们可以在我们的例子中使用。
这里,我们将调用Numpy Arrange函数,它将创建一个有6个值的数组。 但我们也将使用Numpy reshape方法将其重塑为2维,即2行3列。
my_array = np.arange(start = 1, stop = 7).reshape([2,3])
现在,让我们把它打印出来,看看内容。
print(my_array)
OUT。
[[1 2 3]
[4 5 6]]
正如你所看到的,这是一个2行3列的2维数组,包含1到6的数值。
例子1:使用Numpy Ravel来平整一个二维数组
让我们从一个简单的例子开始。
在这里,我们将使用Numpy ravel来平整我们的二维数组,my_array
。
np.ravel(my_array)
OUT:
array([1, 2, 3, 4, 5, 6])
解释
正如你所看到的, 这里的输出是一个一维数组,包含了与输入数组相同的值。
Ravel只是把二维输入的元素 "平铺 "成了一维输出。
请记住,由于我们没有明确使用order
参数,Ravel默认使用的是'C
'顺序,即行优先顺序。
例子2:按行平铺一个数组
接下来,我们将使用 "order
" 参数来指定扁平化数组元素的顺序。
在这个例子中,我们要明确地按行先顺序平铺输入。 为此,我们将设置order = 'C'
。(正如我在上面的语法部分所解释的,设置order = 'C'
,使数组按行先顺序扁平化)。
让我们看一下。
np.ravel(my_array, order = 'C')
OUT。
array([1, 2, 3, 4, 5, 6])
解释
在这个例子中,我们设置了order = 'C'
,它以行优先的顺序对输入进行了平铺。
所以输出是一个一维数组,其元素与输入相同,按行先顺序排列。
(注意:本例中的输出与例1的输出相同。 这是因为当我们没有明确使用order
参数时,Numpy ravel默认为order = 'C'
)。
例子3:按列扁平化数组
现在,让我们用order = 'F'
来扁平化数组。
这将使元素以列先的顺序进行扁平化。
np.ravel(my_array, order = 'F')
输出。
array([1, 4, 2, 5, 3, 6])
解释
这里,我们设置order = 'F'
。 通过这样做,我们告诉Numpy ravel以列先的顺序对输入的元素进行平铺。
注意,在这个例子中,输出数组中的元素的排列方式与例子2中的输出不同。
在例子2中,这些元素是按行先顺序排列的。
但是在这里,因为我们设置了order = 'F'
,所以元素被排列成了列先的顺序。
例子4:使用Numpy Ravel来平整一个列表
接下来,我们不对 Numpy 数组进行操作,而是对一个Python list 进行操作。
让我们快速创建一个 Python list。
my_list = [[1,2,3],[4,5,6]]
现在,让我们用 Numpy ravel 把它压平。
np.ravel(my_list)
OUT:
array([1, 2, 3, 4, 5, 6])
解释
这实际上与例子 1 非常相似。我们只是用 Numpy ravel 来平整一个 Python 对象。
但是我们不是在平整一个 Numpy 数组,而是在平整一个 Python 列表。
尽管如此,正如你所看到的,输出是一个一维的列表,它包含了与输入列表相同的值。
我想向你展示这一点,以便你理解。Numpy ravel可以对Numpy数组进行操作,也可以对类似数组的对象,如Python列表和图元进行操作。 (这与Numpy flatten方法相反,它只对Numpy数组进行操作)。
例子 5:通过改变输入数组来改变一个扁平化的数组(即显示ravel产生一个原始数组的视图)
最后,让我们再做一个例子。
这将展示Numpy ravel的一个非常微妙的属性和它产生的输出。
具体来说,我将向你展示Numpy ravel产生一个原始数组的视图。
创建数组
首先,让我们创建一个数组。 我们将其称为new_array
。
new_array = np.arange(start = 1, stop = 7).reshape([2,3])
扁平化数组
接下来,我们将用Numpy ravel对其进行平铺,并将输出结果保存为unravelled
。
unravelled = np.ravel(new_array)
改变原始数组
现在,我们要改变原始数组。
new_array[0,0] = 999
并且让我们把它打印出来,这样我们就可以看到数组的新内容了。
print(new_array)
OUT:
[[999 2 3]
[ 4 5 6]]
注意,第一个值已经被改为999
。
检查扁平化的数组
最后,让我们检查一下我们从2D输入创建的扁平化数组。
print(unravelled)
输出。
[999 2 3 4 5 6]
我的天啊。
unravelled
的第一个值也被改变了!
解释
让我们回顾一下发生了什么。
- 我们创建了一个二维Numpy数组
- 我们使用Numpy ravel将二维数组扁平化为一维数组,并将新的输出以新的名称存储起来
- 然后我们改变了原来的输入数组
- 这也改变了扁平化的输出数组
问题是,为什么扁平化的数组也被改变了?
原因是,Numpy ravel的输出并不完全是一个新的对象。
它是一个 观点的,而不是对原始对象的复制和重组。
从Numpy手册中读到这段话。
当对NumPy数组进行操作时,可以使用视图直接访问内部数据缓冲区,而不需要四处复制数据。这确保了良好的性能,但如果用户不知道这是如何工作的,也会引起不必要的问题。因此,了解这两个术语之间的区别,知道哪些操作返回拷贝,哪些返回视图是很重要的。
这有点技术性,但视图在保持相同的数据缓冲区的同时,"创造了一种新的方式来观察数据"。
同样,这是一个技术问题,但需要知道的是:如果你改变了原始对象中的数据,它也会改变Numpy ravel创建的任何输出中的值。 如果你不知道发生了什么,这可能会导致问题。
关于Numpy Ravel的常见问题
现在你已经了解了Numpy ravel并看到了一些例子,让我们回顾一下关于该技术的一些常见问题。
常见问题。
问题1:Numpy Ravel和Numpy Flatten之间有什么区别
简单的说:Numpy ravel是一个函数,但Numpy flatten是一个方法。
让我们快速建立一个Numpy数组,我将告诉你如何使用它们两个。
my_array = np.arange(start = 1, stop = 7).reshape([2,3])
现在我们有一个数组的例子,我们可以使用flatten方法。
my_array.flatten()
OUT。
array([1, 2, 3, 4, 5, 6])
或者我们可以使用ravel函数。
np.ravel(my_array)
OUT。
array([1, 2, 3, 4, 5, 6])
而它们的工作方式实际上是一样的。
然而,这其中有一个微妙的复杂性,即Numpy flatten产生的是一个真正的副本,而Numpy ravel产生的是一个视图。 我在例子5中解释了什么是视图。
问题2:为什么我的扁平化数组的值一直在变化?
如果你用Numpy ravel来平铺一个数组,并且用一个新的名字来存储这个输出,那么你需要理解Numpy ravel的输出是一个视图而不是一个严格的副本。
这意味着改变原始输入数组的值也会改变扁平化后的输出数组的值。
我在例子5中展示了这种行为。
在下面的评论中留下你的问题
你对Numpy ravel函数还有疑问吗?
请在下面的评论区留下你的问题。
加入我们的课程,学习更多关于Numpy的知识
你在本教程中看到的例子应该足以让你开始学习,但如果你认真学习Numpy,你应该报名参加我们的高级课程,称为Numpy Mastery。
关于Numpy还有很多东西要学,Numpy Mastery将教给你一切,包括。
- 如何创建Numpy数组
- 如何使用Numpy的随机函数
- "Numpy随机种子 "函数的作用
- 如何重塑、分割和组合你的Numpy数组
- 以及更多...
此外,它将帮助你在几周内完全掌握语法。 你会发现如何在编写Numpy代码时变得 "流畅"。
在这里了解更多。