Numpy学习笔记
一、Numpy为什么快
1、内存块风格
ndarray到底跟原生python列表有什么不同呢,请看一张图: 从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。 这是因为ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。 总结: list -- 分离式存储,存储内容多样化 ndarray -- 一体式存储,存储类型必须一样2、ndarray支持并行化运算(向量化运算)
numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算3、效率远高于纯Python代码
Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,所以,其效率远高于纯Python代码。 效率比较:import random import time import numpy as np a = [] for i in range(100000000): a.append(random.random()) # 通过%time魔法方法, 查看当前行的代码运行一次所花费的时间 %time sum1=sum(a) b=np.array(a) %time sum2=np.sum(b)
二、N维数组-ndarray
1、ndarray的属性
2、ndarray的类型
创建数组的时候指定类型三、基本操作
1、生成数组的方法
1.1生成0和1的数组
np.ones(shape, dtype) np.ones_like(a, dtype) np.zeros(shape, dtype) np.zeros_like(a, dtype)
1.2 从现有数组生成
np.array(object, dtype) np.asarray(a, dtype)关于array和asarray的不同 : asarray相当于索引的形式,并没有真正的创建一个新的
1.3 生成固定范围的数组
1.3.1 np.linspace (start, stop, num, endpoint)
创建等差数组 — 指定数量参数: start:序列的起始值 stop:序列的终止值 num:要生成的等间隔样例数量,默认为50 endpoint:序列中是否包含stop值,默认为ture
1.3.2 np.arange(start,stop, step, dtype)
创建等差数组 — 指定步长参数step:步长,默认值为1
1.3.3 np.logspace(start,stop, num)
创建等比数列参数:num:要生成的等比数列数量,默认为50
1.4 生成随机数组
1.4.1 使用模块介绍
np.random模块1.4.2 正态分布
一、基础概念复习:正态分布
a. 什么是正态分布 正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的标准差,所以正态分布记作N(μ,σ )。 b. 正态分布的应用 生活、生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。 c. 正态分布特点 μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。 标准差如何来? --方差 是在概率论和统计方差衡量一组数据时离散程度的度量 其中M为平均值,n为数据总个数,σ 为标准差,σ ^2可以理解一个整体为方差 --标准差与方差的意义 可以理解成数据的一个离散程度的衡量二、正态分布创建方式
np.random.randn(d0, d1, …, dn) 功能:从标准正态分布中返回一个或多个样本值
np.random.normal(loc=0.0, scale=1.0, size=None) loc:float 此概率分布的均值(对应着整个分布的中心centre) scale:float 此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高) size:int or tuple of ints 输出的shape,默认为None,只输出一个值
np.random.standard_normal(size=None) 返回指定形状的标准正态分布的数组。举例1:生成均值为1.75,标准差为1的正态分布数据,100000000个
import numpy as np import matplotlib.pyplot as plt # 生成均匀分布的随机数 x1 = np.random.normal(1.75, 1, 100000000) # 画图看分布状况 # 1)创建画布 plt.figure(figsize=(20, 10), dpi=100) # 2)绘制直方图 plt.hist(x1, 1000) # 3)显示图像 plt.show()举例2:随机生成4支股票1周的交易日涨幅数据 4支股票,一周(5天)的涨跌幅数据,如何获取? 随机生成涨跌幅在某个正态分布内,比如均值0,方差1
1.4.3 均匀分布
np.random.rand(d0, d1, ..., dn) 返回[0.0,1.0)内的一组均匀分布的数。
np.random.uniform(low=0.0, high=1.0, size=None) 功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high. 参数介绍: low: 采样下界,float类型,默认值为0; high: 采样上界,float类型,默认值为1; size: 输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出mnk个样本,缺省时输出1个值。 返回值:ndarray类型,其形状和参数size中描述一致。
np.random.randint(low, high=None, size=None, dtype='l') 从一个均匀分布中随机采样,生成一个整数或N维整数数组, 取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
画图看分布情况:
import matplotlib.pyplot as plt # 生成均匀分布的随机数 x2 = np.random.uniform(-1, 1, 100000000) print(x2) # 画图看分布状况 # 1)创建画布 plt.figure(figsize=(10, 10), dpi=100) # 2)绘制直方图 plt.hist(x=x2, bins=1000) # x代表要使用的数据,bins表示要划分区间数 # 3)显示图像 plt.show()