干货分享Numpy数组基础

北京好皮肤科专科医院 http://m.39.net/baidianfeng/a_12001933.html

作者:杰克,某生物科技公司AI主管,研究领域涉及NLP、知识图谱、深度学习等,曾带队获得DF平台上CCF大数据与计算智能大赛决赛三等奖。

Numpy数组基础

Python中的数据操作几乎是NumPy数组操作的同义词:甚至像Pandas这样的工具也是围绕NumPy数组构建的。本文将介绍几个使用NumPy数组操作来访问数据和子数组以及拆分、重塑和连接数组的示例。

本文将在这里介绍几类基本的数组操作:

数组的属性:确定数组的大小、形状、内存消耗和数据类型

数组的索引:获取和设置单个数组成员的值

数组的切片:在较大的数组中获取和设置更小的子数组

数组的重塑:改变给定数组的形状

数组的合并和拆分:将多个数组合并为一个,将一个数组拆分为多个

数组的属性

首先让我们讨论一些有用的数组属性。我们将从定义三个随机数组开始,即一维、二维和三维数组。我们将使用NumPy的随机数生成器,我们将seed设置一个值,以确保每次运行此代码时生成相同的随机数组:

每个数组都有ndim(维数)、shape(每个维的大小)和size(数组的总大小)等属性:

另一个有用的属性是dtype,数组的数据类型:

其他属性包括itemsize,它列出了每个数组成员的大小(以字节为单位)和nbytes,它列出了数组的总大小(以字节为单位):

一般来说,我们期望nbytes等于itemsize乘以size。

数组索引:访问单个成员

如果您熟悉Python的标准列表索引,那么NumPy中的索引会感觉非常熟悉。在一个一维数组中,i^{th}值(从零开始计数)可以通过在方括号中指定所需的索引来访问,就像Python列表一样:

要从数组末尾索引,可以使用负索引:

在多维数组中,可以使用逗号分隔的索引元组访问成员:

也可以使用上述任何索引符号来修改值:

请记住,与Python列表不同,NumPy数组具有固定类型。这意味着,例如,如果您尝试将浮点值插入整数数组,该值将被静默截断。

数组切片:访问子数组

正如我们可以使用方括号访问单个数组成员一样,我们也可以使用方括号访问带有slice符号的子数组,由冒号(:)字符标记。NumPy切片语法遵循标准Python列表的语法;要访问数组x的一部分,请使用以下命令:

如果其中任何一个未指定,则默认为值start=0,stop=维度大小,step=1。我们将看看在一维和多维中访问子数组。

一维子数组

一个可能令人困惑的情况是当step值为负时。在这种情况下,start和stop的默认值被交换。这成为反转数组的便捷方式:

多维子数组

多维切片的工作方式相同,多个切片用逗号分隔。

例如:

最后,子数组维度甚至可以一起反转:

访问数组的行和列

一种常用的操作是访问数组的单行或单列。这可以通过结合索引和切片来完成,使用一个由单个冒号(:)标记的空切片:

在访问行的情况下,可以省略空切片以获得更紧凑的语法:

子数组作为无副本视图

关于数组切片的一件重要且非常有用的事情是它们返回数组数据的views而不是copies。这是NumPy数组切片不同于Python列表切片的一个地方:在列表中,切片将是副本。考虑我们之前的二维数组:

让我们从中提取一个2\times2子数组

现在如果我们修改这个子数组,我们会看到原来的数组被改变了!观察:

这种默认行为实际上非常有用:这意味着当我们处理大型数据集时,我们可以访问和处理这些数据集的各个部分,而无需复制底层数据缓冲区。

创建数组的副本

尽管数组视图有很好的特性,但有时在数组或子数组中显式复制数据是有用的。这可以使用copy()方法来很容易地完成:

如果我们现在修改这个子数组,原始数组不会被触及:

数组的重塑

另一种有用的操作类型是数组重塑。最灵活的方法是使用reshape方法。例如,如果要将数字1到9放入3\times3网格中,可以执行以下操作:

请注意,要使其正常工作,初始数组的大小必须与重塑数组的大小相匹配。在可能的情况下,reshape方法将使用初始数组的非副本视图,但对于不连续的内存缓冲区,情况并非总是如此。

另一种常见的重塑模式是将一维数组转换为二维行或列矩阵。这可以通过reshape方法来完成,或者更容易地通过在切片操作中使用newaxis关键字来完成:

数组的拼接和拆分

以上所有操作都在单个数组上工作。也可以将多个数组组合成一个数组,反过来也可以将一个数组拆分成多个数组。我们接下来看看这些操作。

数据拼接

NumPy中两个数组的拼接或连接主要是使用函数np.concatenate、np.vstack和np.hstack来完成的。np.concatenate将一个元组或数组列表作为它的第一个参数,我们可以在这里看到:

您还可以一次连接两个以上的数组:

它也可以用于二维数组:

对于混合维度的数组,使用np.vstack(垂直堆叠)和np.hstack(水平堆叠)函数会更清楚:

类似地,np.dstack将沿第三个轴堆叠数组。

数组的拆分

拼接的反向操作是拆分,它由函数np.split、np.hsplit和np.vsplit实现。对于其中的每一个,我们可以传递一个给出分割点的索引列表:

请注意,N个分割点将导致N+1个子数组。

相关函数np.hsplit和np.vsplit类似:

同样,np.dsplit将沿第三个轴拆分数组。

参考资料

TheBasicsofNumPyArrays(


转载请注明:http://www.aierlanlan.com/rzgz/3234.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了