Numpy的核心特征之一就是N-维数组对象——ndarray。ndarray是Python中一个快速、灵活的大型数组容器。数组允许使用类似于标量的操作语法在整块数据上进行数学计算。
生成数组最简单的方式就是array函数,array函数接收任意的序列行对象(也包括其他的数组),生成一个新的包含数据的Numpy数组。
例:将python列表转化为数组。
或者利用numpy数组生成函数进行操作
以np.arange举例,取值范围从0-49,步长为2生成Numpy数组:
数组生成函数
函数名 | 描述 |
---|---|
array | 将输入数据(可以是列表、元组、数组以及其他序列)转换为ndarray,如不显式指明数据类型,则自动推断;默认复制所有的输入数据 |
asarray | 将输入转换为ndarray,但如果输入已经是ndarray则不再赋值 |
arange | Python内建函数range的数组版,返回一个数组 |
ones | 根据给定形状和数据类型生成全为1的数组 |
ones_like | 根据所给的数组生成一个形状一样全为1的数组 |
zeros | 根据给定形状和数据类型生成全为0的数组 |
zeros_like | 根据所给的数组生成一个形状一样全为0的数组 |
empty | 根据给定形状生成一个形状一样但没有初始化数值的空数组(注意,空不代表为0) |
empty_like | 根据所给数组生成一个形状一样但没有初始化数值的空数组 |
full | 根据给定形状和数据类型生生成指定数值的数组 |
full_like | 根据所给的数组生成一个形状一样但内容是指定数值的数组 |
eye, identity | 生成一个N × N特征举证(对角线位置都是1,其余位置是0) |
查看数组的维数用.ndim
方法
查看数组的形状用.shape
方法
查看数组的数据类型用.dtype
方法
查看数组的大小用.size
方法
查看数组的每个元素所占字节数用.itemsize
方法
举例:查看数组Z的维数、形状、数据类型、大小、以及计算数组的内存大小
numpy的数据类型,即dtype,是一个特殊的对象,它包含了ndarry需要为某一种类型数据所申明的内存块信息(也称为元数据,即表示数据的数据),其可以在创建数组时指定。:
也可以由.astype
方法显式地转换数组的数据类型
例:int类型与float类型的互转,注意,当float类型转为int类型后,小数点后被抹去
dtype通常按照一个方式命令:类型名,比如int与float,后面接上表明每个元素位数的数字。一个标准的双精度浮点值(pythpn中称为float),将使用8字节或64位,因此这个类型在Numpy中称为float64。
Numpy数据类型
类型 | 类型代码 | 描述 |
---|---|---|
int8, uint8 | i1,u1 | 有符号和无符号的8数位整数 |
int16, uint16 | i2,u2 | 有符号和无符号的16数位整数 |
int32,uint32 | i4,u4 | 有符号和无符号的32数位整数 |
int64,uint64 | i8,u8 | 有符号和无符号的64数位整数 |
float16, | f2 | 半精度浮点数 |
float32 | f4或f | 标准单精度浮点数;兼容C语言float |
float64 | f8或d | 标准双精度浮点数;兼容C语言double和Python float |
float128 | f16或g | 拓展精度浮点数 |
complex64 | c8,c16,c32 | 分别基于32、64、128位浮点数的复数 |
complex128 | ||
complex256 | ||
bool | ? | 布尔值,存储True或False |
object | O | Python object类型 |
string_ | S | 修正的ASC II 字符串类型;如生成一个长度为10的字符串类型,使用‘s10’ |
unicode_ | U | Unicode类型,使用‘U10’ |
可以使用np.iinfo(int数据类型)
和np.finfo(float数据类型)
查看每种数据类型的取值范围:
示例:
不必担心如何记住Numpy数据类型,尤其是刚接触numpy的时候。通常只需要关心数据类型的大类,如整数、浮点型、布尔值或字符串等。
numpy对于用户最重要的特性即为向量化,因为数组允许进行批量计算而无需使用for循环。
任何两个等尺寸数组之间的算数操作都应用了逐元素操作的方式
数组之间的对应元素举例:乘法(此处与线性代数的矩阵乘法不同),减法
带有标量的算数操作,会把标量作为计算参数传递给每一个元素:
同尺寸数组之间的比较,会产生一个布尔值数组:
不同尺寸的书组件操作,将会使用到numpy的广播特性。
与python列表类似
当传入一个数值给数组的切片,如 arr[5:8] = 12,数值被传递给了整个数组。此处与python内建列表不同,对数组的切片值直接作用在原数组上的,而不是使用切片赋值成新的数组。因为numpy是为处理大数组设计的,如果持续复制数据,将会引起内存问题。:
如果想要拷贝一份数组的切片而不是用作视图查看的话,则必须复制该数组,如arr[5:8].copy()
对于二维数组,每个索引值对应的元素不再是一个值而是一个数组:
单个元素的索引可以通过递归的方式获得:
numpy中二维数组将0轴看作”行“,1轴看作”列“。在更高维的数组中,0轴表示最外层数组的索引号,最小的数字轴表示最内层数组的索引号。
如对于三维数组:
标量和数组都可以传递给 a r r 3 d [ 0 ] arr3d[0] arr3d[0]:
与二维数组类似, a r r 3 d [ 1 , 0 ] arr3d[1,0] arr3d[1,0]返回的是一个一维数组:
一维数组:
注意:numpy索引从0开始,1:6,从1开始到6为止(不包括6)
二维数组
上例中数组沿0轴开始切片,表达式 a r r z d [ : 2 ] arrzd[:2] arrzd[:2]的含义为选择 a r r z d arrzd arrzd的前两“行”。
多组切片:
单独一个冒号表示选择整个轴上的数组,因此可以按照如下方式进行更高维度的切片:
对切片进行赋值也会对原数组进行改变:
考虑以下例子,假若我们关于人名的数据存放在了数组中,并且存在一些重复的人名:
假设每个人名都和data数组中的一行相对应,并且我们想要选中所有‘Bob’的行。与数学操作类似,数组的比较操作(比如==)也是可以向量化的。因此names数组和字符串‘Bob’会产生一个布尔值数组:
在索引数组是可以传入给布尔值数组
布尔值数组的长度必须和数组轴索引长度一致,当其不一致时,布尔值选择数据的方法不会报错,所以要小心使用。
我们也可以对布尔值索引使用切片操作:
为了选择‘Bob’以外的数据,可以使用 != 或在条件表达式前使用~对条件取反:
当使用多个名字来组合时,需要使用布尔算术运算符(&或者|,使用and和or无效)
使用常识设置布尔值数组:
神奇索引是numpy的属于,用于使用整数数组进行数据索引
假设我们由8×4数组:
我们可以通过传递一个包含指明所需顺序的列表或数组来选出符合特定顺序的子集:
也可以通过负的索引,从尾部开始进行选择:
使用神奇索引对两个维度进行重新排列:
若代码改为arr[[1, 5, 7, 2], [0, 3, 1, 2]]
则结果为选出元素(1,0)、(5,3)、(7,1)和(2,2)
转置是一种特殊的数据重组形式,可以返回底层数据的视图而不需要复制任何内容
对于二维数组
使用.T
方法或者transpose方法
对于高维数组
使用transpose
方法:
点击进行下一章节学习:numpy常用函数(一元通用函数、二元通用函数列表)
或回到主目录:Numpy基础(基于jupyter notebook探索)