NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
一、Numpy安装
使用pip
工具安装
python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose
--user
选项可以设置只安装在当前的用户下,而不是写入到系统目录。
Linux
下安装
Ubuntu & Debian
sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose
CentOS/Fedora
sudo dnf install numpy scipy python-matplotlib ipython python-pandas sympy python-nose atlas-devel
Mac
系统
Mac
系统的 Homebrew
不包含 NumPy
或其他一些科学计算包,所以可以使用以下方式来安装:
python -m pip install numpy scipy matplotlib
验证是否成功:
➜ ~ python3
Python 3.6.5 (default, May 28 2018, 22:41:59)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from numpy import *
>>> eye(4)
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
1、Numpy数据类型
NumPy支持比Python更多种类的数值类型。下表列出了NumPy中定义的不同数据类型。
数据类型 | 描述 |
---|---|
boo_ | 存储一个字节的布尔值(true or false) |
int_ | 默认整数,相当于 C 的long,通常为int32或int64 |
intc | 相当于 C int,通常为int32或int64 |
intp | 用于索引的整数,相当于 C 的size_t,通常为int32或int64 |
int8 | 1个字节(-128 ~ 127) |
int16 | 16 位整数(-32768 ~ 32767) |
int32 | 32 位整数(-2147483648 ~ 2147483647) |
int64 | 64 位整数(-9223372036854775808 ~ 9223372036854775807) |
uint8 | 8 位无符号整数(0 ~ 255) |
uint16 | 16 位无符号整数(0 ~ 65535) |
uint32 | 32 位无符号整数(0 ~ 4294967295) |
uint64 | 64 位无符号整数(0 ~ 18446744073709551615) |
float_ | float64的简写 |
float16 | 半精度浮点:符号位,5 位指数,10 位尾数 |
float64 | 双精度浮点:符号位,11 位指数,52 位尾数 |
complex_ | complex128的简写 |
complex64 | 复数,由两个 32 位浮点表示(实部和虚部) |
complex128 | 复数,由两个 64 位浮点表示(实部和虚部) |
complex256 | 复数,128位 |
object | Python对象类型 |
string_ | 修正的ASCII字符串类型 |
unicode_ | 修正的Unicode类型 |
小技巧:int8,int16,int32,int64 可替换为等价的字符串 'i1','i2','i4',其他类型也有类似的缩写。
np.astype
显式地转换数据类型
Numpy
还有一些预先定义的特殊值:
比如:np.nan
、np.pi
、np.e
np.nan
: 缺失值,或者理解为'不是一个数'
np.pi
:圆周率 3.1415926...
np.e
:自然数e 2.718281828459045...
一、Numpy 数组
1、数组创建
1).使用array方法。使用Python列表或者原则作为参数如:
a1 = np.array([2,3,4])
a2 = np.array((1,23,3))
数组的类型将根据序列中元素的类型推导出来。同时array
自动将二维或三维序列转换为对应的二维或者三维数组。
Numpy
数组被创建时也可以制定数据的类型如:
c = np.array([2,3,4], dtype=complex)
我们也可以创建一个都是0的数组或者都是1的数组例如:
使用zero
创建一个都是0的数组:
b1 = np.zeros((3,4))
b = np.zeros((5,), dtype=np.float)
创建一个全部为1的数组
np.ones((2,3,4), dtype=np.int16) # 制定类型
创建一个为空的数组:
np.empty((2,3))
可能返回未初始化的垃圾数值,不安全
创建一个全有8组成的数组:
np.full((3,4), 8)
2). 返回array
序列函数
使用arange
返回array
序列函数:np.arange(start, stop, step, dtype)
使用linspace
函数:np.linspace(start, stop, num. endpoint, retstep, dtyp)
备注:arange
浮点会有精度问题,可以使用linspace
。
更多类似的函数有:array, zeros, zeros_like, ones, ones_like, empty, empty_like, arange, linspace, numpy.random.rand, numpy.random.randn, fromfunction, fromfile
。
2、数组运算
对数组进行算术运算,就会对整个数组的所有元祖进行逐一运算,并将运算结果保存在一个新数组内,不破坏原始数组。
>>> a = np.array([20,30,40,50])
>>> b = np.arange(4)
>>> b
array([0, 1, 2, 3])
>>> c = a+b
>>> c
array([20, 31, 42, 53])
>>> b**2
array([0, 1, 4, 9])
>>> np.sin(a)
array([ 0.91294525, -0.98803162, 0.74511316, -0.26237485])
计算矩阵乘法:使用@
或者dot(),如
>>> A = np.array([[1,1], [0,1]])
>>> B = np.array([[2,0], [3,4]])
>>> A @ B
array([[5, 4],
[3, 4]])
>>> A.dot(B)
array([[5, 4],
[3, 4]])
对于+=
和 *=
这一类操作符,会修改原始的数组,而不是新建一个。
3、通用函数
函数名 | 描述 |
---|---|
abs | 逐个元素进行绝对值计算 |
fabs | 复试的绝对值计算 |
sqrt | 平方根 |
square | 平方 |
exp | 自然指数函数 |
log | 以e为底的对数 |
log10 | 以10为底的对数 |
log2 | 以2为底的对数 |
sign | 计算每个元素的符号值 |
ceil | 计算每个元素的最高整数值 |
floor | 计算每个元素的最小整数值 |
rint | 保留到整数位 |
modf | 分别将元素的小数部分和整数部分按数组形式返回 |
isnan | 判断每个元素是否为NaN,返回布尔值 |
isfinite | 返回数组中的元素是否有限 |
isinf | 返回数组中的元素是否无限 |
cos | 余弦 |
sin | 正弦 |
tan | 正切 |
arccos | 反余弦 |
arcsin | 反正弦 |
arctan | 反正切 |
下面是部分二元通用函数:
函数名 | 描述 |
---|---|
add | 将数组的对应元素相加 |
subtract | 在第二个数组中,将第一个数组中包含的元素去除 |
multiply | 将数组的对应元素相乘 |
divide | 相除 |
floor_divide | 整除,放弃余数 |
power | 幂函数 |
maxium | 逐个元素计算最大值 |
minimum | 逐个元素计算最小值 |
mod | 按元素进行求模运算 |
4、索引切片迭代
Numpy的切片操作,默认是修改原数组的,而不是原生Python那样,以复制为主。
>>> a = np.arange(10)**3
>>> a
array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729])
>>> a[2]
8
>>> a[2:5]
array([ 8, 27, 64])
>>> a[:6:2]
array([ 0, 8, 64])
>>> a[:6:2]=-1000
>>> a
array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512,
729])
>>> a[::-1]
array([ 729, 512, 343, 216, 125, -1000, 27, -1000, 1,
-1000])
5、添加删除去重
下面是几个常见的数组操作:
- append:将值添加到数组末尾
- insert: 沿指定轴将值插入到指定下标之前
- delete: 返回删掉某个轴的子数组的新数组
- unique: 寻找数组内的唯一元素
6、形状变换
可以通过数组的shape属性,查看它的形状,reshape方法不会修改数组本身,resize则正好相反:
7、堆积数组
可以在不同的轴上堆积数组:
>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[7., 4.],
[8., 8.]])
>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[3., 0.],
[0., 1.]])
>>> np.vstack((a,b))
array([[7., 4.],
[8., 8.],
[3., 0.],
[0., 1.]])
>>> np.hstack((a,b))
array([[7., 4., 3., 0.],
[8., 8., 0., 1.]])
>>> np.column_stack((a,b))
array([[7., 4., 3., 0.],
[8., 8., 0., 1.]])
8、分割数组
使用hsplit,可以沿着数组的水平轴拆分数组,方法是指定要返回的相等形状数组的数目,或者指定在其后面进行拆分的列:
>>> a = np.floor(10*np.random.random((2,12)))
>>> a
array([[3., 3., 9., 3., 3., 1., 6., 5., 2., 2., 3., 5.],
[8., 1., 4., 0., 0., 1., 5., 9., 9., 0., 8., 9.]])
>>> np.hsplit(a,3)
[array([[3., 3., 9., 3.],
[8., 1., 4., 0.]]), array([[3., 1., 6., 5.],
[0., 1., 5., 9.]]), array([[2., 2., 3., 5.],
[9., 0., 8., 9.]])]
>>> np.hsplit(a, (3,4))
[array([[3., 3., 9.],
[8., 1., 4.]]), array([[3.],
[0.]]), array([[3., 1., 6., 5., 2., 2., 3., 5.],
[0., 1., 5., 9., 9., 0., 8., 9.]])]
>>> np.array_split(a,3)
[array([[3., 3., 9., 3., 3., 1., 6., 5., 2., 2., 3., 5.]]), array([[8., 1., 4., 0., 0., 1., 5., 9., 9., 0., 8., 9.]]), array([], shape=(0, 12), dtype=float64)]
>>> np.array_split(a,3, axis=0)
[array([[3., 3., 9., 3., 3., 1., 6., 5., 2., 2., 3., 5.]]), array([[8., 1., 4., 0., 0., 1., 5., 9., 9., 0., 8., 9.]]), array([], shape=(0, 12), dtype=float64)]
>>> np.array_split(a,3, axis=1)
[array([[3., 3., 9., 3.],
[8., 1., 4., 0.]]), array([[3., 1., 6., 5.],
[0., 1., 5., 9.]]), array([[2., 2., 3., 5.],
[9., 0., 8., 9.]])]
9、视图和复制
在操作或变换数组的时候,有时候会修改数组本身,有时候又不会,具体分为下面三种情况:
- 完全不复制
- view视图(view)
- 深度拷贝(copy)
10、统计方法
方法 | 说明 |
---|---|
sum | 求和 |
mean | 算术平均数 |
std | 标准差 |
var | 方差 |
min | 最小值 |
max | 最大值 |
argmax | 最大元素在指定轴上的索引 |
argmin | 最小元素在指定轴上的索引 |
cumsum | 累积的和 |
cumprod | 累积的乘积 |
11、随机数
numpy 带一个random模块,下表是部分函数:
函数 | 功能 |
---|---|
random | 返回一个区间[0.0, 1.0)中的随机函数 |
seed | 向随机数生成器传递随机状态种子 |
permutation | 返回一个序列的随机排列,或者返回一个乱序的整数范围序列 |
shuffle | 随机排列一个序列 |
rand | 从均匀分布中抽取样本 |
randint | 根据给定的有低到高的范围抽取随机整数 |
randn | 从均值0,方差1的正态分布中抽取样本 |
normal | 从正态分布中抽取样本 |
beta | 从beta分布中抽取样本 |
gamma | 从伽马分布中抽取样本 |
uniform | 从均匀[0, 1)中抽取样本 |
... | ... |