多维数组ndarray是NumPy库的核心数据结构,在真正对一个ndarray进行各种操作之前,我们首先需要能够创建ndarray。常见的创建ndarray的方法有很多中,本文就来一一介绍这些方法。
本文的主要内容有:
1、从其他Python数据结构创建
2、使用NumPy数组创建函数创建
3、基于已存在的NumPy数组创建
4、从磁盘读取文件的方式创建
5、使用其他Python库的库函数
从其他Python数据结构创建这种方法,是使用array()函数,基于一个现有的Python序列,比如列表或者元组,来定义NumPy的数组。
首先看下array()函数的定义:
通常只需要传入一个列表或者元组对象即可,也可以指定元素的类型,不指定时,会自动进行类型的推断。
使用NumPy数组创建函数创建
NumPy库中有40多个内置函数,可以用于创建数组,但真正比较常用的有以下这几个函数:
1、linspace()函数
用于创建等差数组,也就是数组中的元素是均匀分布的。
从函数定义中,可以看出有以下几点需要注意:
1)通常只需要指定等差数列的开始值和结束值即可,默认生成一个包含50个元素的等差数列。
2)生成的元素中,默认将开始值start和结束值stop均包含在内的。
2、arange()函数
arange()函数也可以用于创建等差的数组,类似于Python内置的range()函数。
从函数的定义看,与linspace()不同的地方在于:
1)不能指定元素数量,通过参数start、stop、step来进行自动推断。
2)生成的元素范围为[start, stop),不包含结束值。
3、ones()函数
创建指定形状的数组,并将元素填充为1。
4、zeros()函数
用于创建指定形状的数组,并将元素填充为0。
需要注意的是,数组的形状,应当使用元组进行传递(虽然一维数组传递一个整数也是可以的)。
5、random模块
使用numpy.random模块中的函数可以创建随机数组。
其中,使用random.uniform()函数可以创建均匀分布的随机数组。
上面代码中创建了-1到1之间均匀分布的随机数组,元素个数1000000个,通过直方图可视化查看时,将其分为1000组,基本上是可以看出均匀分布的。
uniform()函数中的参数分别为:
low指定随机分布的下限,high指定随机分布的下限,size指定数组元素的个数。
通过random.normal()可以创建正态分布的随机数组。
上面代码中,创建了一个期望为0,标准差为0.1的正态分布的随机数组。
normal()函数中的参数分别为:
loc指定正态分布的期望值,scale指定正态分布的标准差,size指定数组元素个数。
除了以上5个函数外,还有其他创建各种特定形状的矩阵的函数等,根据场景需要,可以在使用时查阅相关API文档。
基于已存在的NumPy数组创建如果已经存在一个NumPy的多维数组,我们可以利用NumPy提供的函数,通过复制、连接或者更改,来创建一个新的NumPy的多维数组对象。
1、copy()函数
使用numpy的copy函数,可以复制一个多维数组。
从上面代码中,可以看到通过NumPy.copy()函数可以进行数组的复制,也可以直接调用一个已有数组对象的copy()方法来进行。
其实,NumPy中的很多操作,提供两种方式对多维数组进行操作:
1)使用NumPy中的函数进行操作,将数组对象作为函数的参数。
2)使用数组对象的对应方法进行操作。
2、stack系列函数
NumPy提供很多方法可以进行数组的拼接,从而生成一个新的数组。比如:vstack()和hstack()分别进行垂直和水平的连接。
从磁盘读取文件的方式创建这种方式是创建大型数组的最常见情况,但是,很多时候,我们其实会选择使用pandas进行IO操作,所以,这种方式,仅作了解即可。
有数据文件如下:
从文件中读取数据并创建数组的代码如下:
需要说明的是data.csv与代码文件在同一个路径中。
由于文件是以逗号分割的csv文件,并且第一行为表头,所以需要跳过一行。
使用其他Python库的库函数由于NumPy是Python科学计算库相关技术栈中的基础核心库,所以,许多Python库,比如SciPy、Pandas、OpenCV、PyTorch等,都可以使用NumPy数组作为数据交换的通用格式。
因此,这些库中也都会提供一些创建、操作和处理NumPy数组的相关函数。这些内容在后面介绍到相关库时,会再行展开说明。
总结本文分别介绍了基于Python原生的序列创建NumPy数组、基于已存在的NumPy数组创建新的NumPy数组、NumPy内部函数创建特定数组、从磁盘数据创建NumPy数组和使用其他Python数据科学库的库函数创建NumPy数组的方法。
需要说明的是,创建NumPy数组的方式有很多种,这里只是列举了笔者认为相对较为常用的方法。
感谢您的拨冗阅读,希望对您有所帮助!
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。