1.nunpy模块简介
1.Numpy是高性能科学计算和数据分析的基础包
2.也是pandas等其他数据分析的工具的基础
3.NumPy具有多维数组功能,运算更加高效快速
python安装方法
# python安装 pip install numpy # 引用方式: import numpy as np # anaconda环境下 conda install numpy '''anaconda已经自动帮助我们下载好了数据分析相关的模块,其实无需我们再下载'''
# 可以看下面计算bmi参数时间比较
numpy计算比python计算快太多
2.数组概念
注意:nunpy中的数组,所有的元素必须是相同的数据类型
# 主要是numpy封装的用于数学计算的数据结构 # 一维数组:np.array(列表) np.array(元组) res = np.array([1,2,3,4]) res1 = np.array((1,2,3,4)) print(type(res),type(res1)) # print(res.dtype) # 二维数组:np.array([列表,列表]) 使用最为频繁 np.array([ [1,2,3,4], [9,8,7,6] ]) # 三维数组基本不用 np.array([[ [1,2,3,4], [9,8,7,6], [4,6,7,2] ]])
1.基于嵌套列表创建二维数组 arr1 = np.array([[1,3,5,7], [2,4,6,8], [11,13,15,17], [12,14,16,18], [100,101,102,103]]) 2.基于嵌套元组创建二维数组 arr2 = np.array(((8.5,6,4.1,2,0.7),(1.5,3,5.4,7.3,9), (3.2,3,3.8,3,3),(11.2,13.4,15.6,17.8,19)))
3. 数据类型
布尔型 bool_ 整型 int_ int8 int16 int32 int64 int32 只能表示(-2**31,2**31-1),因为它只有32个位,只能表示2**32个数 无符号整型 uint8 uint16 uint32 uint64 u全称:unsigned 浮点型 float_ float16 float32 float64 复数型 complex_ complex64 complex128
# 数据类型
import numpy as np
res=np.array([1,1.1,2,3,4.2])
res.dtype
结果:dtype('float64') # 只要有一个浮点型,整个数组都是浮点型
4.常用属性
1)数组的转换(对高维数组而言) import numpy as np li1 = [ [1,2,3], [4,5,6] ] a = np.array(li1) a.T 结果 array([[1, 4], [2, 5], [3, 6]])
就相当于是将行变成列,列变成行,它也是一个比较常用的方法
参数:
dtype 数组元素的数据类型
size 数组元素的个数
ndim 数组的维数
shape 数组的维度大小(以元组形式)
reshape 修改数组大小
import numpy as np
a = np.array([[1,2,3],[4,5,6]]) # a.shape 3 结果:(2, 3) 2行3列
b = a.reshape(3,2)
print (b)
[[1, 2]
[3, 4]
[5, 6]]
5.numpy常用方法
# 如何查看方法提示 # 方式1:shift+tab tab按第二次的时候出现详细方法 np.array #方式2:问号执行 #np.array? # arange() ->range的numpy版,支持浮点数 np.arange(1,10,2) 结果:array([1, 3, 5, 7, 9]) # linspace() 类似arange(),第三个参数为数组长度 np.linspace(1,10,20) # 这个方法与arange有一些区别,arange是顾头不顾尾,而这个方法是顾头又顾尾,在1到10之间生成的二十个数每个数字之间的距离相等的,前后两个数做减法肯定相等 zeros() 根据指定形状和dtype创建全0数组 np.zeros((3,4)) # 创建3行4列的数组 ones() 根据指定形状和dtype创建全1数组 np.ones((3,4)) empty() 根据指定形状和dtype创建空数组(随机值) np.empty(10) eye() 根据指定边长和dtype创建单位矩阵 np.eye(5)
6.索引与切片
1、在一维数组中,列表的所有索引方法都可以使用在数组中,而且还可以使用间断索引(花式索引)和逻辑索引; 2、在二维数组中,位置索引必须写成[rows,cols]的形式,方括号的前半部分用于锁定二 维数组的行索引,后半部分用于锁定数组的列索引; 3、如果需要获取二维数组的所有行或列元素,那么,对应的行索引或列索引需要用英文 状态的冒号表示; '''一维数组''' # 一维数组与列表在索引取值和切片上一模一样 age = np.array([13,19,22,14,19,11]) age[-1] # 跟列表切片一致,结果:11 age[:3] # 跟列表索引取值一致 结果:array([13, 19, 22]) # 间断索引(花式索引),获取19,14,19 # 数组[[索引值1,索引值2,索引值3]] age[[1,3,4]] # 逻辑索引(布尔索引) 使用较为频繁 age < 18 # array([ True, False, False, True, False, True]) age[age < 18] # array([13, 14, 11]) '''二维数组''' res = np.array([[ 1, 3, 5, 7], [ 2, 4, 6, 8], [ 11, 13, 15, 17], [ 12, 14, 16, 18], [100, 101, 102, 103]]) res[1:3] # 行索引 res[:,1:3] # 列索引 """res[ 行索引,列索引] # 不写默认所有""" # 只拿4,6,13,15 res[1:3,1:3] res[3,3] # 18 res[3,:] # array([12, 14, 16, 18]) res[:,1] # array([ 3, 4, 13, 14, 101]) res[0:2,1:3] # array([[3,5],[4,6]])
7.运算符
# 数学运算符 + 数组对应元素的加和 - 数组对应元素的差 * 数组对应元素的乘积 / 数组对应元素的商 % 数组对应元素商的余数 // 数组对应元素商的整除数 ** 数组对应元素的幂指数 # 比较运算符 > 等价np.greater(arr1,arr2) 判断arr1的元素是否大于arr2的元素 >= 等价np.greater_equal(arr1,arr2) 判断arr1的元素是否大于等于arr2的元素 < 等价np.less(arr1,arr2) 判断arr1的元素是否小于arr2的元素 <= 等价np.less_equal(arr1,arr2) 判断arr1的元素是否小于等于arr2的元素 == 等价np.equal(arr1,arr2) 判断arr1的元素是否等于arr2的元素 != 等价np.not_equal(arr1,arr2) 判断arr1的元素是否不等于arr2的元素
8. 基本函数
# 常用的数学函数 np.round(arr) 对各元素四舍五入 np.sqrt(arr) 计算各元素的算术平方根 np.square(arr) 计算各元素的平方值 np.exp(arr) 计算以e为底的指数 np.power(arr, α) 计算各元素的指数 np.log2(arr) 计算以2为底各元素的对数 np.log10(arr) 计算以10为底各元素的对数 np.log(arr) 计算以e为底各元素的对数 # 常用的统计函数(必会) np.min(arr,axis) 按照轴的方向计算最小值 np.max(arr,axis) 按照轴的方向计算最大值 np.mean(arr,axis) 按照轴的方向计算平均值 np.median(arr,axis ) 按照轴的方向计算中位数 np.sum(arr,axis) 按照轴的方向计算和 np.std(arr,axis) 按照轴的方向计算标准差 np.var(arr,axis) 按照轴的方向计算方差 ''' 注意: axis=0时,计算数组各列的统计值 axis=1时,计算数组各行的统计值 ''' array([[ 80.5, 60., 40.1, 20., 90.7], [ 10.5, 30., 50.4, 70.3, 90.], [ 35.2, 35., 39.8, 39., 31.], [91.2, 83.4, 85.6, 67.8, 99.]]) '''不使用axis参数''' # python计算每一行的和 Sum = [] for row in range(res.shape[0]): Sum.append(np.sum(arr2[row,:])) # 计算每一列的平均 Avg = [] for col in range(res.shape[1]): Avg.append(np.mean(arr2[:,col])) '''使用axis参数''' arr2.sum(axis = 1) # 等价np.sum(arr2, axis = 1) np.mean(arr2, axis = 0) # 等价arr2.mean(axis = 0)
9.随机数
numpy中的random子模块
np.random
rand 给定形状产生随机数组(0到1之间的数) np.random.rand(3,3)
randint 给定形状产生随机整数 np.random.randint(5,size=(2,4))
choice 给定形状产生随机选择
shuffle 与random.shuffle相同
uniform 给定形状产生随机数组(随机均匀分布) np.random.uniform((1,2))产生1,2之间的随机数
normal 随机正态分布
np.random.normal(10,size=(3,3)) # 以10位分隔符取值,靠近10取值多
array([[10.07142027, 11.48868803, 11.53035586], [ 9.95786927, 10.79440548, 10.15130168], [10.94953714, 8.26487928, 9.43984842]])
案例:正规赌场下的结局案例
"""有10000块钱,去某赌场嗨皮 假设输赢概率都是50%(一般赢49%),并且赢一场赚100,输一场亏100 jason总共玩了1500场,可能还剩下多少钱""" # 总钞票数 money = 10000 # 先利用uniform生成1500次0到1之间的随机均匀分布 r = np.random.uniform(0,1,1500) # 判断输赢 for time in r: if time < 0.5: money -= 100 else: money += 100 money
# 进阶操作(模拟仿真) '''记录每一次赌局完成后的钞票数''' money = 10000 pgs = [money] r = np.random.uniform(0,1,1500) for time in r: if time < 0.5: money -= 100 else: money += 100 pgs.append(money) '''提前搂一眼后面会详细讲解的matplotlib模块''' import matplotlib.pyplot as plt plt.plot(range(1501),pgs) # x轴与y轴坐标数据 plt.show()