Numpy Ravel, Explained

288 阅读12分钟

本教程将告诉你如何使用Numpy ravel函数。它将解释该函数的语法,并向你展示如何使用Numpy ravel来平整一个数组。

下面是一个内容表。如果你正在寻找特定的东西,你可以点击任何一个链接,跳到相应的章节。

目录:

说了这么多, 如果你是Numpy的新手, 我建议你阅读整个教程.

Numpy Ravel的快速介绍

让我们首先快速浏览一下Numpy ravel函数的作用。

Numpy ravel将一个Numpy数组或类似的Python对象平铺出来。

A simple image that shows how Numpy ravel flattens out a Numpy array.

说白了:这和Numpy的flatten方法非常相似,后者也是将Numpy数组压平。

为了理解我所说的 "压平 "Numpy数组是什么意思,让我们快速回顾一下Numpy数组的形状。

对Numpy数组和数组 "形状 "的快速回顾

你可能记得,Numpy数组是Python中的一种特殊结构,它以行和列的格式保存数字数据

Numpy数组可以有不同的 "形状"

Numpy数组可以以一维、二维或多维的形式存在。 它们有点像数学中的向量和张量。

下面是一个一维数组的例子。

这里是一个二维数组的例子。

A simple example of a 2D numpy array, with the numbers from 1 to 6.

你会注意到,这两个数组中的值都是一样的,但 "形状 "不同。

在一个数组中,所有的值都排列在一个 "行 "中(尽管一维数组是一个特例,从技术上讲,这并不完全是一个行)。

而在另一个数组中,数值被排列成一个两行三列的结构。

为什么数组的形状很重要

数组的形状很重要,因为Numpy和Python中的不同操作要求Numpy数组具有特定的形状。

例如,当我们用Scikit Learn进行机器学习时,大部分的输入数组需要是2维的形状。

然而,在其他情况下,我们有时需要将数组 "拉平 "成一维的形状。

这经常发生在更高级的数据处理中,我们需要首先将一个数组压平,然后以某种方式进一步处理它。

最终,你需要工具来重塑和平整数组,这就是Numpy ravel的作用。

An example of Numpy ravel flattening a 2D Numpy array into a 1D array.

说了这么多,让我们来看看Numpy ravel的语法。

Numpy Ravel的语法

在这里,我们将看一下Numpy ravel函数的语法。

我将解释高层次的语法,并详细解释一些重要的参数。

关于导入Numpy的一个简单说明

只是简单提醒一下关于使用Numpy的问题。

每当我们在Python中使用Numpy时,我们首先需要Numpy导入我们的环境。

通常的惯例是用别名 "np, " 来导入Numpy,使用这个代码。

import numpy as np

你在本教程中看到的所有语法和代码都将假定你是这样导入Numpy的。

Numpy Ravel语法

Numpy ravel函数的语法相当简单。

你以np.ravel() 的方式调用该函数。

在括号内,你必须提供一个类似数组的对象或你想操作的类似数组对象的名称。

An image that explains the syntax of the Numpy ravel function.

还有一个可选的参数,即order 参数,我们将在本篇文章后面讨论。

所以我们假设你有一个名为my_array 的二维Numpy数组。

为了使这个数组扁平化,你可以输入np.ravel(my_array) ,这将产生一个具有相同元素的一维数组。

我们将在例子部分更详细地研究这个例子(以及其他一些例子)。

Numpy ravel的参数

ravel函数只有一个参数:order 参数。

让我们快速看一下它。

order (可选)

order 参数允许你指定数值在扁平化的输出数组中出现的顺序。

换句话说,它控制了函数如何将数值重组为一维形状。

这个参数的两个可能的参数是。

  • order = 'C'
  • order = 'F'

这个参数是可选的,所以如果你不使用它,它将自动默认为order = 'C'

让我们来看看这个参数的两个设置。

命令 = 'C

如果你设置了order = 'C' ,那么ravel函数将按照行的第一顺序将元素平铺出来。

A picture that shows Numpy ravel with order = 'c'

顺便提一下,这被称为'C' 顺序,因为在C语言编程中,数据就是这样被存储和检索的。

记住:这是Numpy ravel的默认行为,所以如果你决定不明确使用该参数,该函数将自动以行先的顺序平铺你的数组。

order = 'F

如果你把这个参数设置为order = 'F' ,ravel函数将以列先的顺序将元素压平。

An image that shows how Numpy ravel works with order = 'F'

这被称为'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只是把二维输入的元素 "平铺 "成了一维输出。

A simple example of Numpy 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' ,它以行优先的顺序对输入进行了平铺。

An example of Numpy Ravel with row-first, order, which is 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以列先的顺序对输入的元素进行平铺。

An example of Numpy ravel with order = 'F'.

注意,在这个例子中,输出数组中的元素的排列方式与例子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代码时变得 "流畅"。

在这里了解更多。

了解更多关于Numpy Mastery的信息