前言
NumPy是python科学计算的基础软件包,提供了多维数组类及其派生类,和python中列表相比,Numpy在速度上拥有明显的优势,底层使用C语言来编写,内置并行运算功能,并且内部解除了GIL,这意味着Numpy在运行速度和并行计算方面有这先天优势。
安装
Numpy安装非常简单,可以使用pip命令直接安装,安装是可以使用==选择版本号,使用-i参数选择下载速度更改的镜像源。
pip install numpy
导入Numpy是写成import numpy as np 是程序员约定俗称的规则
>>> import numpy as np
列表VS数组
python的列表操作非常灵活,特别是引入负数索引后,更是为列表操作注入了“神奇的力量”,每一个位程序员第一次使用python列表时,都会被它的便捷所打动。
首先,python列表的元素类型不受限制,同一个列表内,列表元素可以是不同的数据类型,甚至可以是函数。
其次,python列表元素可以动态增删,可以通过append()方法向列表末尾增加元素,insert()在指定位置插入元素,pop()删除指定索引的元素,remove()可以删除指定的元素。
最后,python列表的索引非常简单,灵活,高效,[-1]可以取得最末尾的元素,[1:-1]可以返回“掐头去尾”后的列表,[::-1]可以反转列表,[::2]可以隔开一个取一个元素。
Numpy数组的操作更加便捷,比python列表更是有过之而不及,并且还提供了大量的函数,但是同时也增加了限制:一是数组元素必须具有相同的数据结构;二是数据一旦创建,其元素数量就不能在改变了。
说到这里,你也许会问:既然Numpy数组有这些限制条件,那我们为啥还要使用它呢?答案是,Numpy数据具有极高的,接近C语言的运行的效率,同时又继承了python列表操作便捷,灵活的特点,可以说Numpy数组是专为处理科学数据而生的。
数组的数据类型
Numpy支持的数据类型主要有整型,浮点型,布尔型和复数型,每一个种数据类型根据占用内存的字节数又分为多个不同的子类型。
整型:np.int8,np.int16,np.int32,np.int64
无符号整型:np.uint8,np.uint16,np.uint32,np.uint64
浮点型:np.float16,np.float32,np.float64
布尔型:np.bool
复数型:np.complex64,np.complex128
注意:在创建数组的时,如果不指定数据类型,Numpy会根据输入的参数自动选择合适的数据类型,通常在指定数组类型的时候,可以省略类型后面的数字,如果省略数字,整型和无符号整型默认是32位,浮点型默认是64位,复数型默认是128位。
数组的属性
属性 | 说明 |
---|---|
ndarray.dtype | 数组的数据类型 |
ndarray.shape | 数组的结构,也可以理解为数组的形状 |
ndarray.size | 数组的元素格式 |
ndarray.itemsize | 每个元素占用内存的大小,以字节为单位 |
ndarray.ndim | 数组的维度数,也叫秩 |
ndarray.flags | 数组的内存信息 |
ndarray.real | 数组实部 |
ndarray.imag | 数组虚部 |
ndarray.data | 数组在内存中实际存储区域的起始地址 |
数组的方法
在python基础语法中,我们介绍列表对象有追加,插入等多种方法,相比之下,数组的操作方法更多,目前我们只需要记住两个方法就行:ndarray.astype()和ndarray.reshape().前者可以修改元素类型,后者可以重新定义数组的结构,这两个方法的重要性和其对应的属性一样,记住ndarray.dtype和ndarray.shape这两个属性及其对应的修改数据类型和数组结构两个方法,有助于在调试代码是快速定位问题。
>>> a = np.arange(6)
>>> a
array([0, 1, 2, 3, 4, 5])
>>> a.shape
(6,)
>>> a.dtype
dtype('int32')
>>> a = a.reshape((2,3)) #改变数组结构
>>> a
array([[0,1,2],
[3,4,5]])
>>> a = a.astype(np.float) #改变数据类型
>>> a.dtype
dtype('float64')
广播和矢量化
Numpy数据具有极高的,接近C语言的运行效率,处理速度远比python列表快得多,Numpy拥有区别于列表的两大“独门绝技”:广播和矢量化。广播可以理解为隐式地对每个元素实施操作;矢量化可以理解为代码中没有显示的循环,索引等。可能有点抽象,下面举例来说明一下
例一 数值型数组的各个元素加1
使用python列表实现如下:
>>> a = [0, 1, 2, 3, 4]
>>> for i in range(len(a)):
a[i] += 1
>>> a
[1, 2, 3, 4, 5]
使用Numpy数组实现如下:
>>> a = np.array([0, 1, 2, 3, 4])
>>> a += 1
>>> a
array([1, 2, 3, 4, 5])
例二 两个等长的数值型数组的对应元素相加
使用python中zip()函数实现如下:
>>> a = [0, 1, 2, 3, 4]
>>> b = [5, 6, 7, 8, 9]
>>> [i+j for i, j in zip(a,b)]
[5, 7, 9, 11, 13]
使用numpy数组进行操作如下:
>>> a = np.array([0, 1, 2, 3, 4])
>>> b = np.array([5, 6, 7, 8, 9])
>>> a + b
array([5, 7, 9, 11, 13])
上面的两个例子分别用列表和数组的方式给出了答案。显然用Numpy数组实现起来要比用python列表更直观,更简洁。这真是得益于Numpy的两大特性:广播和矢量化。
参考书籍<<Python高手修炼之道数据处理与机器学习实战>>
生活不可能像你想象得那么好,但也不会像你想象得那么糟。我觉得人的脆弱和坚强都超乎自己的想象。有时,我可能脆弱得一句话就泪流满面;有时,也发现自己咬着牙走了很长的路。 -----莫泊桑