Numpy介绍
NumPy是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多。
1、导入
import numpy as np
2、创建数组
import numpy as np
# 第一种:从列表传入
a=np.array([1,2,3,4,5]) # 一维
a=np.array([[0,1,2],[9,8,7]]) # 二维,列表里面的元素是列表类型
# 第二种:从列表创建
lst=[1,2,3,4,5]
a=np.array(lst) # 一维
a=np.array(lst,lst) #二维
生成全n的数组
import numpy as np
# 生成全0数组
a=np.zeros(7) # 括号内传个数,默认浮点数类型
# 生成全1数组
a=np.ones(6)
# dtype指定元素类型
a=np.ones(7,dtype='bool')
# fill将数组设为指定值
arr=np.array([1,2,3,4])
a.fill(7) # 让数组的每个元素都等于7
'''
数组中要求所有元素的 dtype 是一样的
如果传入参数的类型与数组类型不一样,需要按照已有的类型进行转换。
'''
a.fill(2.5) # [2, 2, 2, 2]
a = a.astype("float") # 强制类型转换
a.fill(2.5) # [2.5, 2.5, 2.5, 2.5]
arange序列、linspace等差数列
import numpy as np
# 生成整数序列
arr=np.arange(1,10,2) # 左闭右开,与range用法相同
# 生成等差数列
arr=np.linspace(1,10,21) # 包含区间右边值,从1到10取21个数组成等差数列
random随机数序列
一维
import numpy as np
# 生成包含10个,0到1之间的随机浮点数的数组
a=np.random.rand(10)
# 生成包含10个,在-1.96到1.96之间符合标准正态分布的数组
a=np.random.randn(10)
# 生成包含10个,1到20之间的随机整数的数组
a=np.random.randint(1,20,10)
二维
import numpy as np
a=np.random.rand(3,2) # 3行2列
a=np.random.randn(3,2) # 3行2列
a=np.random.randint(1,20,(3,2)) # 3行2列
3、numpy数学操作
import numpy as np
a=np.array([7,2,5,0])
print(a+1) # 逐个元素加1 [8 3 6 1]
b=np.array([6,5,4,3])
print(a+b) # 对应位置元素相加 [13 7 9 3]
4、数组的属性
import numpy as np
a=np.array([1,2,3,4])
# 查看类型
type(a)
# 查看数组中元素的数据类型
a.dtype
# 查看形状
a.shape
# 查看数组里面元素的个数
a.size
# 查看数组的维度
a.ndim
5、索引和切片
一维数组
import numpy as np
a=np.array([1,2,3,4])
# 索引,取第一个元素
a[0]
# 修改第一个元素
a[0]=10
# 切片
a[1:3] # 左闭右开
a[-2:]
a[::2] # 步长为2
多维数组
import numpy as np
np.array([[1,2,3,1,5],[4,5,6,4,6],[7,8,9,7,0]])
# 索引
a[1,2] # 第2行第3列
# 取整行
a[1] # 第2行的所有元素
# 取整列
a[:,1] # 第2列的索引元素
#切片
a[0,1:4] # 第1行,第2列到第4列
a[1::2,::2] # 第2行到最后步长为2,所有列步长为2
花式索引
花式索引实现任意位置的操作
一维花式索引
import numpy as np
a=np.arange(0,100,10)
index=[1,2,-3] # 指定索引位置
y=a[index]
# 使用布尔数组实现花式索引
mask=np.array([0,2,2,0,0,1,0,0,1,0],dtype=bool)
y=a[mask]
二维花式索引
# 给定行和列
a = np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
a[(0,1,2,3,4),(1,2,3,4,5)] # 返回一条次对角线上的5个值
a[-3:,[0,2,4]] # 返回最后3行的1,3,5列
# 使用布尔数组实现花式索引
mask = np.array([1,0,1,0,0,1],dtype = bool)
a[mask,2] # 返回1,3,6行,的第3列
‘不完全’索引
import numpy as np
a = np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
# 给定行索引,返回多行
a[:3] # 前3行
con = np.array([0,1,1,0,1,0],dtype = bool) # 使用花式索引取出第2,3,5行
a[con]
6、where语句
where(array) 返回所有非零元素的索引
一维数组
import numpy as np
a=np.array([0,12,5,20])
# 判断数组中的元素是不是大于10
a>10
# 返回数组中所有大于10的元素的索引位置
np.where(a>10)
# 取出大于10的元素
a[a>10]
# 等价于
a[np.where(a>10)]
7、类型转换
import numpy as np
a=np.array([1.5,-3],dtype=float)
asarray函数
a=np.array([1,2,3])
np.asarray(a.dtype=float)
astype方法
返回一个新数组
a=np.array([1,2,3])
a.astype(float)
8、数组操作
一维数组
import numpy as np
a=np.array([7,3,6,2,5,3,4])
数组排序
sort函数
np.sort(a) # 非原地排序
argsort函数
argsort返回从小到大的排列在数组中的索引位置
order=np.argsort(a)
a[order[0]]
a[order[-1]]
数学操作
求和
np.sum(a)
# 或
a.sum()
最大值
np.max(a)
# 或
a.max()
最小值
np.min(a)
# 或
a.min()
均值
np.mean(a)
# 或
a.mean()
标准差
np.std(a)
# 或
a.std()
相关系数矩阵
b=np.array([1,2,3,4,5,6,7])
np.cov(a,b)
多维数组
数组形状
# shape
a=np.arange(6)
a.shape=(2,3) # 2行3列
# reshape返回新数组
a=np.arange(6)
a.reshape(2,3) # 2行3列
转置
a=np.array([[0, 1, 2],
[3, 4, 5]])
a.T # 转置
a.transpose() # 只要没赋值给本身,a的数值不会变换
数组连接concatenate函数
x = np.array([[0,1,2],[10,11,12]])
y = np.array([[50,51,52],[60,61,62]])
# 增加行
z = np.concatenate((x,y)) # 默认沿着第一维进行连接 等价于 np.vstack((x,y))
# 增加列
z = np.concatenate((x,y),axis = 1) # 沿着第二维进行连接 等价于 np.hstack((x,y))
z = np.array((x,y)) # 连接成三维的数组 等价于 np.dstack((x,y))
9、Numpy内置函数
a=np.array([-1,2,3,-2])
np.abs(a) # 绝对值
np.exp(a) # e的a次方
np.median(a) # 中值
np.cumsum(a) # 累积和