Numpy是python用于进行可科学计算,尤其是数据分析时,所用到的一个基础库。它是大量Python数学和科学计算包的基础,比如pandas库就用到了Numpy。
安装
国际安装惯例
pip install numpy
numpy的心脏:ndarray
Numpy最重要的一个特点就是其N维数组对象(即ndarray);其实说是 N维的矩阵更好理解 。它是一种由同质元素组成的多维数组,元素数量是事先指定好的。同质指的是几乎所有元素的类型和大小都相同。事实上,数据类型由另一个叫做dtype(data-type)的Numpy对象来指定;每个ndarray只有一种dtype。
定义ndarray最简单的方法是使用array()函数,以python列表作为参数,列表的元素即是ndarray的元素
In [1]:import numpy as np
a = np.array([1.5,2.5,3.5,4.5])
a
Out[1]:
array([1.5, 2.5, 3.5, 4.5])
基本属性
数组的维度和元素数量由数组的型(shape)来确定,数组的型由N个正整数组成的元组来指定,元组的每个元素随影每一维的大小。
上面的概念看上去有点难理解,看些例子好懂一点
属性 | 说明 |
---|---|
shape | 数组的型 |
ndim | 数组的维度 |
size | 数组的长度 |
In [1]: b = np.array([[1,2,3],[4,5,6]])
b
Out[1]:
array([[1, 2, 3],
[4, 5, 6]])
In [2]:print('ndin: ',b.ndim)
print('shape: ',b.shape)
print('size: ',b.size)
Out[2]:
ndin: 2
shape: (2, 3)
size: 6
创建数组
数组的创建有几种方式,最常用的就是使用array()函数,参数为单层或嵌套列表
In [1]:b = np.array([[1,2,3],[4,5,6]])
b
Out[1]:
array([[1, 2, 3],
[4, 5, 6]])
除了列表,array()还可以嵌套接收嵌套元组或元组列表作为参数
In [1]:c = np.array(((1,2,3),(4,5,6)))
c
Out[1]:
array([[1, 2, 3],
[4, 5, 6]])
此外,参数可以是由元组或列表组成的列表,其效果相同
In [1]:d = np.array([(1,2,3),(4,5,6)])
d
Out[1]:
array([[1, 2, 3],
[4, 5, 6]])
数据类型
到目前为止,只是使用过简单的整型和浮点型数据类型,其实Numpy还包含多种数据类型
数据类型 | 说明 |
---|---|
int8,uint8 | 有符号和无符号的8位(1个字节)整型 |
int16,uint16 | 16位(2个字节) |
int32,uint32 | 32位(4个字节) |
int64,uint64 | 64位(8个字节) |
float16 | 半精度浮点数 |
float32 | 单精度 |
float64 | 双精度 |
float128 | 拓展精度浮点数 |
complex64 | 用64位浮点数表示的复数 |
complex128 | 128位 |
complex256 | 256位 |
bool | 布尔类型 |
dtype选项
可以通过dtype查看数组的数据类型
In [1]:d.dtype
Out[1]:
dtype('int32')
还可以在创建数组的时候,定义数据类型
In [1]:f = np.array([(1,2,3),(4,5,6)],dtype=np.complex)
print(f)
print(f.dtype)
Out[1]:
[[1.+0.j 2.+0.j 3.+0.j]
[4.+0.j 5.+0.j 6.+0.j]]
complex128
自带的数组创建方法
Numpy库中有几个函数能够生成包含初始值得N维数组,数组元素因函数而异。有了这些函数,仅用一行代码就可以生成大量的数据。
比如:zeros和ones分别可以生成指定长度或形状的全0或全1数组。empty可以生成一个没有任何具体值的数组,通常称这些值为“垃圾值”。
要用这些方法创建多维度数组,只需传入一个表示形状的元组即可。例如:
In [2]: np.zeros((3,3))
Out[2]:
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
In [3]: np.ones((3,3))
Out[3]:
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
In [4]: np.empty((2,3,2))
Out[4]:
array([[[0.00000000e+000, 6.36598737e-314],
[0.00000000e+000, 1.27319747e-313],
[1.27319747e-313, 1.27319747e-313]],
[[1.27319747e-313, 1.27319747e-313],
[0.00000000e+000, 4.44659081e-323],
[2.54639495e-313, 6.42285340e-323]]])
此外,还有arange、linspace和random函数可以用于创建数组。arange与python中range函数有点类似,但也有不同之处,
In [1]: import numpy as np
In [2]: np.arange(0,12,3)
Out[2]: array([0, 3, 6, 9])
#arange的第三个参数可以是浮点数,range则不行
In [3]: np.arange(0,6,0.5)
Out[3]: array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5])
#使用reshape函数,指定形状,将一维数组拆分成不同的部分
In [4]: np.arange(0,6,0.5).reshape(2,6)
Out[4]:
array([[0. , 0.5, 1. , 1.5, 2. , 2.5],
[3. , 3.5, 4. , 4.5, 5. , 5.5]])
linspace与arange非常相似。它的钱两个参数同样是用来指定序列的起始和结尾,但第三个参数不在表示两个相邻数字之间的距离,而是用来指定将有开头到结尾的范围分成几部分
In [5]: np.linspace(0,12,3)
Out[5]: array([ 0., 6., 12.])
random函数是使用随机数填充数组,每次生成的元素都会不同。若要生成多维数组,只需要把数组的大小作为参数传递给它
In [6]: np.random.random(3)
Out[6]: array([0.19724655, 0.75376209, 0.16554352])
In [7]: np.random.random((3,3))
Out[7]:
array([[0.97249775, 0.23825222, 0.87127446],
[0.49011329, 0.25698634, 0.02129674],
[0.08015451, 0.37356949, 0.9233434 ]])