一、Numpy索引及切片
核心:基本索引及切片 / 布尔型索引及切片
基本索引及切片
ar = np.arange(20)
print(ar)
print(ar[4])
print(ar[3:6])
print(‘-----’)
1.一维数组索引及切片
一维数组和列表类似
ar = np.arange(16).reshape(4,4)
print(ar, ‘数组轴数为%i’ %ar.ndim) # 4*4的数组
print(ar[2], ‘数组轴数为%i’ %ar[2].ndim) # 切片为下一维度的一个元素,所以是一维数组
print(ar[2][1]) # 二次索引,得到一维数组中的一个值,单纯一个值的数组轴数为0
print(ar[1:3], ‘数组轴数为%i’ %ar[1:3].ndim) # 切片为两个一维数组组成的二维数组,不包含中间的
print(ar[2,2]) # 带逗号就是指定一个位置。切片数组中的第三行第三列 → 10
print(ar[:2,1:]) # 切片数组中的1,2行、2,3,4列 → 二维数组
print(‘-----’)
2.二维数组索引及切片
ar = np.arange(8).reshape(2,2,2)
print(ar, ‘数组轴数为%i’ %ar.ndim) # 222的数组
print(ar[0], ‘数组轴数为%i’ %ar[0].ndim) # 三维数组的下一个维度的第一个元素 → 一个二维数组
print(ar[0][0], ‘数组轴数为%i’ %ar[0][0].ndim) # 三维数组的下一个维度的第一个元素下的第一个元素 → 一个一维数组
print(ar[0][0][1], ‘数组轴数为%i’ %ar[0][0][1].ndim)
3.三维数组索引及切片
#三维
a1 = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])
a1
a1[0, 0, 1]
4.布尔型索引及切片
ar = np.arange(12).reshape(3,4)
i = np.array([True,False,True])
j = np.array([True,True,False,False])
print(ar)
print(i)
print(j)
print(ar[i,:]) # 在第一维度做判断,只保留True,这里第一维度就是行,ar[i,:] = ar[i](简单书写格式)保留True的保留第一跟第三行
print(ar[:,j]) # 在第二维度做判断,这里如果ar[:,i]会有警告,因为i是3个元素,而ar在列上有4个
5.布尔型索引:以布尔型的矩阵去做筛选
m = ar > 5
print(m) # 这里m是一个判断矩阵 这里打印出True或者False
print(ar[m]) # 用m判断矩阵去筛选ar数组中>5的元素 得到一维数组 → 重点!后面的pandas判断方式原理就来自此处
二、数组索引及切片的值更改、复制
1.修改
ar = np.arange(10)
print(ar)
ar[5] = 100
ar[7:9] = 200
print(ar)
一个标量赋值给一个索引/切片时,会自动改变/传播原始数组
2.复制
np.array(object, dtype)
np.asarray(a, dtype)
a = np.array([[1,2,3],[4,5,6]])
#从现有的数组当中创建
a1 = np.array(a)
#相当于索引的形式,并没有真正的创建一个新的
a2 = np.asarray(a)
关于array和asarray的不同
array相当于深拷贝,完全独立的创建一份。原数组修改,新数组不变
asarray相当于浅拷贝。与原来数组内存地址一样,原数组修改,也会跟着被修改
ar = np.arange(10)
b = ar.copy()
b[7:9] = 200
print(ar)
print(b)
复制,copy的相当于深拷贝,存储空间独立,拷贝后的数据被修改,原数据不变
三、Numpy随机数
numpy.random包含多种概率分布的随机样本,是数据分析辅助的重点工具之一
1.随机数生成
samples = np.random.normal(size=(4,4))
print(samples)
生成一个标准正太分布的4*4样本值
2.随机数生成想要的样本值
numpy.random.rand(d0, d1, …, dn):生成一个[0,1)之间的随机浮点数或N维浮点数组 —— 均匀分布
import matplotlib.pyplot as plt # 导入matplotlib模块,用于图表辅助分析
% matplotlib inline
a = np.random.rand()
print(a,type(a)) # 生成一个随机浮点数
b = np.random.rand(4)
print(b,type(b)) # 生成形状为4的一维数组
c = np.random.rand(2,3)
print(c,type©) # 生成形状为2*3的二维数组,注意这里不是((2,3)) 元素都是0-1之间,如果向0-100 后面直接乘以100即可 c = np.random.rand(2,3)*100
3.正态分布
(1)基础概念复习:正态分布(理解)
a. 什么是正态分布
正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的标准差,所以正态分布记作N(μ,σ )。
b. 正态分布的应用
生活、生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。
c. 正态分布特点
μ决定了其位置,其标准差σ决定了分布的幅度(胖瘦高低)。当μ = 0,σ = 1时的正态分布是标准正态分布。
标准差如何来?
d.方差
是在概率论和统计方差衡量一组数据时离散程度的度量
其中M为平均值,n为数据总个数,σ 为标准差,σ ^2可以理解一个整体为方差。方差越小,数据越集中,正态分布越瘦高
e.标准差与方差的意义
可以理解成数据的一个离散程度的衡量
(2)正态分布创建方式
1、np.random.randn(d0, d1, …, dn)
功能:从标准正态分布中返回一个或多个样本值 ,返回多维数组
2、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,只输出一个值
3、np.random.standard_normal(size=None) #这个默认了loc=0.0, scale=1.0
返回指定形状的标准正态分布的数组。
举例1:生成均值为1.75,标准差为1的正态分布数据,100000000个
x1 = np.random.normal(1.75, 1, 100000000)
4.绘图,根据正态分布数据,绘制直方图
import matplotlib.pyplot as plt import random #设置中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字符集 plt.rcParams['axes.unicode_minus'] = False # 设置负号正常显示 # 生成均匀分布的随机数 x1 = np.random.normal(1.75, 1, 100000000) # 画图看分布状况 # 1)创建画布 plt.figure(figsize=(20, 10), dpi=100) # 2)绘制直方图 plt.hist(x1, 1000) #1000表示要分多少组,就是x轴上面分多少组展示数据。这里是分1000组,正态分布可以看出来什么范围存在的数据较多 # 3)显示图像 plt.show()
4.均匀分布
1. np.random.rand(d0, d1, …, dn)
- 返回[0.0,1.0)内的一组均匀分布的数。
2. 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中描述一致。
3. np.random.randint(low, high=None, size=None, dtype=‘l’)
- 从一个均匀分布中随机采样,生成一个整数或N维整数数组,
- 取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
返回一个整数:
返回一个整数数组:
#生成均匀分布的随机数
x2 = np.random.uniform(-1, 1, 100000000)
4.画图看分布状况
import matplotlib.pyplot as plt # 生成均匀分布的随机数 x2 = np.random.uniform(-1, 1, 100000000) # 画图看分布状况 # 1)创建画布 plt.figure(figsize=(10, 10), dpi=100) # 2)绘制直方图 plt.hist(x=x2, bins=1000) # x代表要使用的数据,bins表示要划分区间数,均匀分布每组数据是100000000/1000 # 3)显示图像 plt.show()
四、Numpy数据的输入输出
numpy读取/写入数组数据、文本数据 后续大多数用pandas方法读写文件,这里先了解下numpy的读写
1.存储数组数据 .npy文件
import os
os.chdir(‘C:/Users/Hjx/Desktop/’)
ar = np.random.rand(5,5)
print(ar)
np.save(‘arraydata.npy’, ar)
#也可以直接 np.save(‘C:/Users/Hjx/Desktop/arraydata.npy’, ar)
看下桌面保存
2.读取数组数据 .npy文件
ar_load =np.load(‘arraydata.npy’)
print(ar_load)
#也可以直接 np.load(‘C:/Users/Hjx/Desktop/arraydata.npy’)
我们尝试用open读取npy文件,报错
3.存储/读取文本文件 只能存数字类型元素,存其他类型元素报错
ar = np.random.rand(5,5)
np.savetxt(‘array.txt’,ar, delimiter=‘,’)
#np.savetxt(fname, X, fmt=‘%.18e’, delimiter=’ ‘, newline=’\n’, header=‘’, footer=‘’, comments='# '):存储为文本txt文件
delimiter=’ ’ 表示每个元素的分隔符
fmt=‘%.18e’ 表示存储的数据类型,%.18e表示科学计数法
查看存的文本。默认是科学计数法表示
我们改成浮点数
ar_loadtxt = np.loadtxt(‘array.txt’, delimiter=‘,’)
print(ar_loadtxt)
#也可以直接 np.loadtxt(‘C:/Users/Hjx/Desktop/array.txt’)
#读取文本,一定要指定分隔符 delimiter,否则报错
ar_loadtext = np.loadtxt(“array.txt”,delimiter=‘,’)
print(ar_loadtext)
我们看下读取的数据类型
默认读取出来的是float类型,我们可以指定
指定读取出来int类型