目录
Numpy
Numpy的概述:
-
NumPy(Numerical Python) 是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,主要用于数组计算。
-
NumPy通常与SciPy(Scientific Python)和Matplotlib(绘图库)一起使用, 这种组合广泛用于替代MatLab,是一个强大的科学计算环境,有助于我们通过Python学习数据科学或者机器学习。NumPy安装:在cmd终端输入pip install numpy。在使用Numpy之前,通过import命令将numpy库导入,并命名为np,例如:import numpy as np。
-
基于NumPy的算法要比纯Python快10到100倍(甚至更快),并且使用的内存更少。
Numpy的部分功能
-
ndarray, 一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。
-
用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
-
用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
-
线性代数、随机数生成以及傅里叶变换功能。
-
用于集成由C、C++、Fortran等语
-
言编写的代码的A C API。
Numpy的ndarray:一种多维数组对象
1.创建ndarray
导入numpy包
import numpy as np
列表创建数组
一维数组
先通过创建一个列表,再同通过np.array()函数进行数据类型转换定义一维数组
a = [0,1,2,3,4,5]
a1 = np.array(a)
[0 1 2 3 4 5]
二维数组
先通过创建一个嵌套的列表元素的列表,再通过np.array()函数进行数据类型转换定义二维数组
a = [[1,2,3,4],[5,6,7,8]]
a1 = np.array(a)
[[1 2 3 4]
[5 6 7 8]]
多维数组
二维数组以上也是创建一个嵌套的列表元素的列表再通过np.array()函数进行转换
函数创建数组
通过指定函数进行创建数组,主要有以下函数
#全为0
print(np.zeros(3))
print(np.zeros((2,3)))
print(np.zeros((2,2,3)))
print()
#全为1
print(np.ones(3))
print(np.ones((2,3)))
print(np.ones((2,2,3)))
print()
#单位矩阵
print(np.eye(3))
print()
#创建指定数量的顺序数组
print(np.arange(3))
print(np.arange(1,10,2)) #此处为1到9的数,步长为2
print()
#将一维数组分成若干等分
print(np.linspace(0,3,10))
print()
#更改数组维度
a = np.array([1,2,3,4])
print(a.reshape(2,2))
2.ndarray的数据类型
创建数组时,我们可以通过dtype属性指定数组元素的数据类型。
a = np.array([0,1,2,3], dtype = np.float64)
常见的数据类型
3.NumPy数组的运算
数组与标量之间的运算
标量值与数组中的每一个数都进行运算
#数组和标量间的运算
arr = np.array([[1,2,3],[4,5,6]])
print(arr + 2)
print(arr - 2)
print(arr * 2)
print(arr / 2)
[[3 4 5]
[6 7 8]]
[[-1 0 1]
[ 2 3 4]]
[[ 2 4 6]
[ 8 10 12]]
[[0.5 1. 1.5]
[2. 2.5 3. ]]
同维数组之间的运算
两个同维数组相对应的元素进行运算
a = np.array([1,2,3],[4,5,6])
b = np.array([7,8,9],[10,11,12])
print(a+b)
print(a-b)
print(a*b)
print(a/b)
矩阵是数组的一个特例,首先将二维数组通过np.mat()转化为矩阵,再通过矩阵之间的运算
(矩阵与数组之间的运算只有乘和除不同)
a = np.array([[1,2],[2,1]])
b = np.array([[1,0],[2,3]])
a1 = np.mat(a)
b1 = np.mat(b)
print(a*b)
print()
print(a1*b1)
[[1 0]
[4 3]]
[[5 6]
[4 3]]
不同维度数组之间的运算
广播特性
当在不同维度的数组运算时,数组会自动将维度进行扩展
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([4,5,6])
print(a+b)
[[ 5 7 9]
[ 8 10 12]
[11 13 15]]
当在比较相同维度的数组时,会产生布尔值
a = np.array([[1,3,5],[7,9,2]])
b = np.array([[2,1,4],[9,5,3]])
b>a
array([[ True, False, False],
[ True, False, True]])
4.数组的索引
轴
一维
对于一维数组只有一个轴,即为0轴,axis=0
二维
三维
切片索引
一维
a = np.array([0,1,2,3,4,5,6,7,8,9])
# 数组第六个数
print(arr[5])
# 数组从第六个数到第七个数
print(arr[5:8])
# 将数组全部转变为3
arr[:] = 3 # 等价arr[:] = arr[0:10]
print(arr)
5
[5 6 7]
[3 3 3 3 3 3 3 3 3 3]
二维
a = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
# 数组第二行
print(arr[1])
# 数组第一行第三列的元素
print(arr[0,2])
# 前两行,等价于arr[0:2]
print(arr[:2])
# 第二列,等价于arr[0:3,1]
print(arr[:,1])
[4 5 6]
3
[[1 2 3]
[4 5 6]]
[2 5 8]
布尔索引
创建一个数组,再与其它进行比较,就会输出一个布尔型的数组
a = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print(a<5)
[[ True True True]
[ True False False]
[False False False]]
如果需要将True 与 False换掉,只需赋值即可
a = np.array([[1,2,3],
[4,5,6],
a[a<5] = 0
print(a)
[[0 0 0]
[0 5 6]
[7 8 9]]
花式索引
花式索引是一个NumPy术语,它指的是利用整数数组进行索引
无论最初的数组是几维的,最后花式索引返回的值都是一维数组
5.函数
通用函数
一元
二元
数学统计方法
求平均值
a=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
# 求平均值
print(np.mean(a))
# 求每一列的平均值
print(np.mean(a,axis = 0))
# 求每一行的平均值
print(np.mean(a,axis = 1))
5.0
[4. 5. 6.]
[2. 5. 8.]
求和
a = np.array([[0,2,1],
[3,5,6],
[0,1,1]])
# 求数组和
print(np.sum(a))
# 求每一列的和
print(np.sum(a,axis = 0))
# 求每一行的和
print(np.sum(a,axis = 1))
19
[3 8 8]
[ 3 14 2]
求最大最小值
a = np.array([[1,5,3],
[4,2,6]])
# 获取整个数组的最小值
print(np.min(a))
# 获取每一列的最小值
print(np.min(a,axis = 0))
# 获取每一行的最小值
print(np.min(a,axis = 1))
print()
# 获取整个数组的最大值
print(np.max(a))
# 获取每一列的最大值
print(np.max(a,axis = 0))
# 获取每一行的最大值
print(np.max(a,axis = 1))
1
[1 2 3]
[1 2]
6
[4 5 6]
[5 6]
排序
np.sort表示对数组元素进行排序。
arr = np.array([[1,5,6],
[4,2,3],
[7,8,9]])
# 进行列排序
print(np.sort(arr,axis = 0))
# 进行行排序
print(np.sort(arr,axis = 1))
[[1 2 3]
[4 5 6]
[7 8 9]]
[[1 5 6]
[2 3 4]
[7 8 9]]
唯一值
np.unique()对数组进行去重并同时返回值会自动排序
names = np.array([3,3,3,2,2,1,1,4,4])
print(np.unique(names))
[1 2 3 4]
生成随机数
函数 | 说明 | |
---|---|---|
rand(d0,d1,..,dn) | 根据d0-dn创建随机数数组,浮点数,[0,1),均匀分布 | np.random.rand(3,4) |
randn(d0,d1,..,dn) | 根据d0-dn创建随机数数组,标准正态分布 | np.random.randn(3,4) |
*randint(low,high,shape)* | *根据shape创建随机整数或整数数组,范围是[low, high)* | *np**.random.randint(100,200,**(3,4))* |
*uniform(low,high,size)* | *产生具有均匀分布的数组,low起始值,high结束值,size形状* | *np.random.uniform(0,10,(3,4))* |
normal(loc,scale,size) | 产生具有正态分布的数组,loc均值,scale标准差,size形状 | np.random.normal(10,5,(3,4)) |
poisson(lam,size) | 产生具有泊松分布的数组,lam随机事件发生率,size形状 | np.random.poisson(3,(3,4)) |
数组拼接
数组拼接有两种方法,一种为行拼接np.hstack(),另外一种为列拼接np.vstack()
a = np.array([[1,2,3],
[4,5,6]])
b = np.array([[7,8,9],
[10,11,12]])
# 进行列拼接
arr1 = np.vstack((a,b))
print(arr1)
# 进行行拼接
arr2 = np.hstack((a,b))
print(arr2)[[ 1 2 3]
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
6.线性代数
线性代数(如矩阵乘法、矩阵分解、行列式以及其他方阵数学等)是任何数组库的重要组成部分
x = np.array([[1., 2., 3.], [4., 5., 6.]])
y = np.array([[6., 23.], [-1, 7], [8, 9]])
#矩阵相乘
x.dot(y)
array([[ 28., 64.],
[ 67., 181.]])