目录
二. ndarray 与 Python 原生list运算效率对比
一. NumPy的基本介绍
ndarray支持并行化运算(向量化运算) - 用于对多维数组(多用于二维数组矩阵)进行高效率的数学运算 效率远远高于纯python代码 - NumPy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制
-
NumPy 相对于 python 的优势 --> 相对于python运算速度更快 -->用于快速处理任意维度的数组(图片就是矩阵构成的)
-
ndarray 介绍 -->NumPy 提供了一个N维数组类型ndarray,它描述了相同的类型的
idtems
的集合.
import numpy as np #创建 ndarray score = np.array([[80,8080,80], [70,7070,70], [60,6060,60]]) print(score) array([[ 80, 8080, 80], [ 70, 7070, 70], [ 60, 6060, 60]])
二. ndarray 与 Python 原生list运算效率对比
#导入模块 import random import time import numpy as np #建立空列表 a = [] #生成随机数,并加入列表中 for i in range(100000): a.append(random.random()) # 通过%time魔法方法,查看当前行的代码运行一次所花费的时间 %time sum_1=sum(a) b = np.array(a) %time sum_2=np.sum(b)
上述代码运算得知np的运算时间明显比标准python运算少
内存风格的差异
-
Python List :访问的时候先访问内存地址在通过内存地址读取里面的数(items-->0x3133005-->值)
-
优:可存储不同的数据类型
-
缺:读取效率低下
-
-
NumPy Array : 访问的时候是直接读取数字(data-->数)
-
优:读取效率高
-
缺:不可在一个array中储存多个数据类型,只能储存统一类型
-
三. N维数组-ndarray
1. ndarray的属性
属性 | 属性解释 |
---|---|
ndarray.shape | 数组维度的元组 |
ndarray.ndim | 数组维数 |
ndarray.size | 数组中的元素数量 |
ndarray.itemsize | 一个数组元素的长度(字节) |
ndarrar.dtype | 数组元素的类型 |
#数组的行列-以元组形式输出
score.shape
#数组的维度
score.ndim
#数组的总数据数
score.size
#元素的字节长度
score.itemsize
#数组类型
score.dtype
2. ndarray 的形状
1. 一维数组的表达: array_one = ([元素一,元素二,元素三,....])
2. 二维数组的表达: array_twe = ([[元素一,元素二,...],[元素一,元素二,...]])
3. 三维数组的表达: array_thire = ([[[元素一,元素二,...],[元素一,元素二,...,]],[元素一,元素二,...],[元素一,元素二,...,]],...]])
# Eg:
One = np.array([1,2,3])
Twe = np.array([[1,2,3],[4,5,6]])
Thire = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[1,4,7]]])
One.shape
Twe.shape
Thire.shape
(2, 2, 3)
3. ndarray的类型
- np.bool ----->用一个字节存储的布尔类型(Ture/False) ------->'b'
- np.int8 ----->一个字节大小, -128 至127 ------->'i'
- np.int16 ----->整数,-32768 至 32767 ------->'i2'
- np.int32 ----->整数,-2^31 至 2^32-1 ------->'i4'
- np.int64 ----->整数,-2^63 至 2^63-1 ------->'i8'
- np.uin8 ----->无符号的整形,0-255 ------->'u'
- np.uint16 ----->无符号的整形,0-65535 ------->'u2'
- np.uint32 ----->无符号的整形,0-2^32-1 ------->'u4'
- np.uint64 ----->无符号的整形,0-2^64-1 ------->'u8'
- np.float16 ----->半精度浮点数:16位,正负号1位,指数5位,精度10位 ------->'f2'
- np.float32 ----->单精度浮点数:32位,正负号1位,指数8位,精度23位 ------->'f4'
- np.float64 ----->双精度浮点数:64位,正负号1位,指数11位,精度52位 ------->'f8'
- np.complex64 ----->复位,分别用两个32位浮点数表示实部和虚部 ------->'c8'
- np.complex128 ----->复位,分别用两个64位浮点数表示实部和虚部 ------->'c16'
- np.object_ ------->python对象 ------->'O'
- np.string_ ------->字符串 ------->'S'
- np.unicode_ -------->unicode类型 -------->'U'
注意 : 若不指定,整数默认位int64, 小数默认float64
# Eg:
eg_1 = np.array([[1,2,3],[4,5,6]],dtype=np.float32)
eg_2 = np.array([["I"],["love"],["python"]],dtype=np.string_)
eg_2
array([[b'I'],
[b'love'],
[b'python']], dtype='|S6')
四. 生成数组的方法
1. 0/1数组的生成
- np.ones(shape[,dtype,order]) #生成([列,行])的全是1的二维数组
- np.ones_like(a[,dtype,order,subok])#将 a 这个数组的元素全部转为1
- np.zeros(shape[,dtype,order]) #生成([列,行])的全是0二维数组
- np.zeros_like(a,[dtype,order,subok])#将 a 个数组的元素全部转为0
zero = np.zeros([4,3]) #生成四行三列的0数组
zero
one = np.ones_like(zero) #生成以zero数组为模板的1数组
one
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
2. 从现有数组生成
- np.array(object[,dtype,copy,order,subok,ndmin])#从现有的数组当中创建(深拷贝,等价于复制)
- np.asarray([,dtype,order])#浅拷贝,相当于一个快捷方式和原数组同步
记忆方式:array是创建数组的,asarray是让一个数组别名为什么(as)
- 对于array类型的数组数据可以用索引进行取值和代替 Eg:array_demo[0,0]=10
3. 生成固定范围的数组
- np.linspace(start,stop,num,endpoint)
- [start]序列的起始值
- [stop]序列的终止值
- [num]要生成的等间隔例数量,默认为50(即等间隔生成多少个的数组)
- [endpoint]序列的中是否包含stop值,默认为Ture
- np.arange(start,stop,step,dtype)
- [start]序列的起始值
- [stop]序列的终止值
- [step]多少个数字生成一个元素
- np.logspace(star,stop,num) #生成10^x的数据
- [start]序列的起始值
- [stop]序列的终止值
- [num]生成的数据个数
#生成0-100其中有11个间隔的数组
np.linspace(0,100,11)
#生成0-100每5个数生成一个元素
np.arange(0,100,5,dtype=np.int16)
#从10^0-10^3生成四个数
np.logspace(0,3,4)
array([ 1., 10., 100., 1000.])
4. 生成随机数组
4.1 均匀分布
- np.random.rand(d0,d1,...,dn)#返回[0.0,1.0]内的一组均匀分布的数(d0,d1....为维度)
- np.random.uniform(low=10.0,high=1.0,size=None)
- 介绍:`从一个均匀分布的[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.
- [low]采样的下限,float类型,默认值为0;
- [high]采样的上界,float类型,默认值为1;
- [size]输出样本数量,为int或者元组(tuple)类型,Eg:size=(m,n,k),则输出mnk个样本,缺省时输出1个值.
- 返回值:ndarray类型,其形状和参数size中描述一致.
- np.random.randint(low,high-None,size=None,dtype="I")
- 介绍:从一个均匀分布的中随机采样,生成一个整数或者N维整数数组,取数范围:如high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数.
np.random.rand(3,4) #生成三行四列的0-1分布均匀的随机数组
x1=np.random.uniform(1,100,10000)
np.random.randint(1,100,(3,5))
array([[50, 53, 80, 17, 63],
[34, 69, 98, 21, 75],
[79, 92, 38, 60, 55]])
import matplotlib.pyplot as plt
#创建均匀分布数据
x1=np.random.uniform(1,100,10000)
#创建画布
plt.figure(figsize=(10,10),dpi=100)
#画图
plt.hist(x=x1,bins=10000)
#展示图片
plt.show()
4.2 正态分布
4.2.1 概念(理解即可)
- 什么是正态分布
- 正态分布是一种概念分布.正态分布是具有两个参数μ和σ的连续型随机变量的分布. 第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的标准差,所以正态分布记作N(μ,σ).
- 正态分布的应用
- 生活,生产与科学实验中很多随机变量的概率分布都可以近似地使用正态分布来描述。
- 正态分布特点
- 均值μ--->图形的左右位置,也是峰值的位置
- 方差σ--->图像的瘦胖,值越小,图像越高,数据越集中,反之值越大,图形越胖,数据越分散
- 当μ=0和σ=1时的正态分布为标准正态分布
- 公式
- np.rangdom.randn(d0,d1,d2,...,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) 返回指定形状的标准正态分布数组。
import matplotlib.pyplot as plt
#建立正态分布数据
zx = np.random.normal(2,0.2,10000)
#创建画布
plt.figure(figsize=(20,8),dpi=100)
#画图
plt.hist(zx,bins=100)
#展示图片
plt.show()
五. 数组的索引和切片
- 二维数组
- 数组[行,列] Eg:ndarray[0:2,0] #前两行第一列
- 三维数组
- 数组[区域,行,列] Eg:ndarray[1,0,0] #第一区域的第一行的第一列
六. 形状修改
- 数组.reshape(shape[,order]) #将数据进行排列后在进行数组生成新的数组,并不是行列互换
- 当reshape([-1,num])时-1 表示数据的所有元素均出现不许要计算,num为列数
- 数组.resize(new_shape[,refcheck]) #将数据进行排列后在进行数组生成但是是修改原来的数组,不产生新的数组,并不是行列互换
- 数组.T #进行行列互换,且生成行的数组
七. 类型修改
- 数组.astype(type)
- 数组.tostring() #直接将数字转换为字符串
八. 数组去重
- np.unique(数组)
九. ndarray的运算
1 逻辑运算
其中的'大于','小于','等于'等等是在数组里面去判断,满足就为Ture,不满足就为False,其中可以实现
- np.all(数组>num) #如果数组内的所有元素都>num(数字)则为Ture,否则为False
- np.any(数组>num) #如果数组内的有一个元素都>num(数字)则为Ture,全部都不满足时为False
3 三元运算符
- np.where(数组 > num ,num(Ture),num(Flase))
- 数组.min(a[,axis,out,keepdims])#返回数组的最小值或者沿轴的最小值
- 数组.max(a[,axis,out,keepdims])#返回数组的最大值或者沿轴的最大值
- 数组.median(a[,axis,out,overwrite_input,keepdims])#计算沿指定轴的中位数
- 数组.mean(a[,axis,dtype,out,keepdims])# 沿着指定的轴进行算数平均值
- 数组.std(a[,axis,dtype,out,ddof,keepdims])#沿着指定的轴的标准差
- 数组.var(a[,axis,dtype,out,ddof,keepdims])#沿着指定的轴的方差
- 在统计的时候,axis轴的取值并不是一定的,Numpy中不同的API轴的值都是不一样,在这里,axis 0代表列,axis 1代表行进行统计
- 数组.argmax(temp,axis=)#返回最大值所在下标或者沿轴的最大值所在下标
- 数组.argmin(temp,axis=)#返回最小值所在下标或者沿轴的最小值所在下标
十. 矩阵(matrix)
1. 定义:
- 和array 的区别就是matrix只能是二维的,但是array可以是多维的
2. 向量:
- 向量是一种特殊的矩阵,讲义中的向量一般都是列向量
- Eg:
3. 加法和标量乘法
- 矩阵加法:行列数相等才可相加.
- Eg:
- Eg:
- 矩阵乘法:每个元素都要乘.
- 公式: (M行,N列)×(N行,L列) = (M行,L列)
- Eg:
5. 矩阵乘法
- 其本质和矩阵向量乘法相同
6. 矩阵乘法的性质
- 矩阵的乘法不满足交换律:A×B ≠ B×A
- 矩阵的乘法满足结合律:A×(B×C) = (A×B)×C
- 单位矩阵:主对角线全是1,其他元素为0的矩阵为单位矩阵
十一. 数组间的运算
- 数组和数的运算:
- 直接每个元素和数进行运算即可
- 数组与数组的运算:
- 必须满足广播机制:即简单理解就是 A数组[行,列] 和 B数组[行,列] 只有行对行,和列对列时的行列相等或者有一方为一的时候才可进行运算.
- 矩阵乘法
- np.matmul(矩阵1,矩阵2)#不可以传如数字
- np.dot(矩阵1,矩阵2)#可以传入数字
本人基本都是个人笔记,非常希望有大佬提出错误和改进之处,但大佬轻喷哈!!!