#numpy学习笔记
import numpy as np
from numpy.core.fromnumeric import ravel, argsort, argmax, argmin
########################################一、numpy数组创建#####################################
x=np.array([1,2,3,4,5])
print( x )
#设置数组的类型
x=np.array([1,2,3,4,5],dtype="float32")
print( x )
########################################二维数组
x=np.array([[1,2,3],
[4,5,6],
[7,8,9]]
)
print(x)
print(x.shape)
#1创建长度为5的数组,值都为0
x=np.zeros(5,dtype=int)
print(x)
#2创建一个2*4的浮点型数组,值都为1
x=np.ones((2,4),dtype=float)
print(x)
#3创建一个3*5的数组,值都是8,8
x=np.full((3,5),8.8)
print(x)
#4创建3*3的单位矩阵
x=np.eye(3)
print(x)
#5创建一个线性序列数组,从1开始到15结束,步长为2
x=np.arange(1,15,2)
print(x)
#6创建一个4个元素的数组,这四个数均匀的分配到0-1
x=np.linspace(0,1,4)
print(x)
#7创建一个10个元素的数组,形成1-10^9的等比数列
x=np.logspace(0,9,10)
print(x)
#8创建一个3*3的,在0-1之间分布的随机数构成的数组
x=np.random.random((3,3))
print(x)
#9创建一个3*3的,均值为0,标准差为1的随机数构成的数组
x=np.random.normal(1,1,(3,3))
print(x)
#10创建一个3*#的,在[0,10)之间的随机整数构成的数组
x=np.random.randint(1,10,(3,3))
print(x)
#11随机重排列
#11.1permutation不会对原数组造成变化影响
x=np.array([10,20,30,40])
y=np.random.permutation(x)
print(x)
print(y)
#11.2shuffle会让原数组发生顺序变化
z=np.random.shuffle(x)
print(x)
print(z)
#12随机采样
x=np.arange(10,25, dtype=float)
print(x)
y=np.random.choice(x,size=(4,3))
print(y)
#概率采样
y=np.random.choice(x,size=(4,3),p=x/np.sum(x))
print(y)
#############################三numpy数组的性质
##1数组的属性
x=np.random.randint(10,size=(3,4))
print(x)
#形状
y=x.shape
print(y)
#维度
y=x.ndim
print(y)
#数组的大小
y=x.size
print(y)
#数组的数据类型
y=x.dtype
print(y)
#数组的索引
#一维数组索引
x1=np.arange(10)
print(x1)
y1=x1[0]
print(y1)
y1=x1[5]
print(y1)
y1=x1[-1]
print(y1)
#二维数组索引
x2=np.random.randint(0,20,(2,3))
print(x2)
y2=x2[0,0]
print(y2)
y2=x2[0][0]
print(y2)
#numpy数组的数据类型是固定的,向一个整型数组插入一个浮点值,浮点值会向下进行取整
x2[0,0]=1.618
print(x2)
print(x2[0,0])
###数组的切片
#一维数组----------跟列表一样
x=np.arange(10)
print(x)
y=x[:3]
print(y)
y=x[3:]
print(y)
y=x[::-1]
print(y)
#二维数组的切片
x=np.random.randint(20,size=(3,4))
print(x)
y=x[:2,:3]
print(y)
y=x[:2,0:3:2]
print(y)
y=x[::-1,::-1]
print(y)
###获取数组的行和列
x=np.random.randint(20,size=(3,4))
print(x)
y=x[1,:]
print(y)
y=x[1]
print(y)
y=x[:,2]
print(y)
#切片获取的视图,而不是副本,所以修改视图的时候原始的数组也会被修改
x=np.random.randint(20,size=(3,4))
print(x)
y=x[:2,:2]
y[0,0]=0
print(y)
print(x)
###修改切片安全方式copy,这样该改变之后原数组不会被修改
x=np.random.randint(20,size=(3,4))
print(x)
z=x[:2,:2].copy()
z[0,0]=0
print(z)
print(x)
##数组的变形
x=np.random.randint(0,10,(12,))
print(x)
y=x.reshape(3,4)
print(y)
#reshape获得的也是视图不是副本
y[0,0]=0
print(y)
print(x)
#一维向量转行向量
y=x.reshape(1,x.shape[0])
print(y)
y=x.reshape(1,x.size)
print(y)
#一维向量转列向量
x=np.random.randint(0,10,(12,))
print(x)
z=x.reshape(x.shape[0],1)
print(z)
y=x[:,np.newaxis]
print(y)
#多维向量转一维向量
x=np.random.randint(0,10,(3,4))
print(x)
y=x.flatten()
print(y)
y[0]=0
print(x)
print(y)
#flatten返回的是副本,不会改变原来的数组
#ravel返回的是视图,会改变原来的数组
y=x.ravel()
print(y)
y[0]=0
print(x)
print(y)
#reshape(-1)返回也是视图
y=x.reshape(-1)
print(y)
####数组的拼接
x1=np.array([[1,2,3],[4,5,6]])
x2=np.array([[7,8,9],[0,1,2]])
#水平拼接,非视图,是副本
x3=np.hstack([x1,x2])
print(x1,'\r\n',x2,'\r\n',x3)
x3=np.c_[x1,x2]
print(x3)
#垂直拼接,非视图
y=np.vstack([x1,x2])
print(y)
y=np.r_[x1,x2]
print(y)
#数组的分裂
#1hsplit水平分割
x=np.arange(1,26).reshape(5,5)
print(x)
left,middle,right=np.hsplit(x,[2,4])
print(left,"\n\r")
print(middle,'\n\r')
print(right,"\n\r")
#垂直分割vsplit
x=np.arange(1,26).reshape(5,5)
print(x)
upper ,middle, lower =np.vsplit(x,[2,4])
print(upper,"\n\r")
print(middle,"\n\r")
print(lower,"\n\r")
########################四、numpy四大运算
#1与数字的加减乘除
x=np.arange(1,6)
print(x)
a=x+5
b=x-5
c=x*5
d=x/5
print(a,b,c,d)
print("\r\n")
print(x)
a=-x
b=x**2
c=x//2
d=x%2
print(a,b,c,d)
#2绝对值,三角函数,指数,对数
x=np.array([1,-1,2,-2,0])
print(x)
a=abs(x)
b=np.abs(x)
print(a,b)
x=np.linspace(0,np.pi,3)
print(x)
a=np.sin(x)
b=np.cos(x)
c=np.tan(x )
print(a,"\n\r",b,"\n\r",c,"\n\r")
x=[1,0,-1]
a=np.arcsin(x)
b=np.arccos(x)
c=np.arctan(x )
print(a,"\n\r",b,"\n\r",c,"\n\r")
#指数
x=np.arange(3)
print(x )
a=np.exp(x)
print(a)
#对数
x=np.array([1,2,4,8,10])
a=np.log(x)
b=np.log2(x)
c=np.log10(x)
print(a)
##两个数组运算
x1=np.arange(1,6)
x2=np.arange(6,11)
print("\r\n",x1,"\r\n",x2)
a=x1+x2
b=x1-x2
c=x1*x2
d=x1/x2
#矩阵运算
x=np.arange(9).reshape(3,3)
print(x)
#转置
y=x.T
print(y)
#矩阵乘法
x=np.array([[1,0],[1,1]])
y=np.array([[0,1],[1,1]])
a=x.dot(y)
b=np.dot(x,y)
print(a,"\r\n",b)
c=y.dot(x)
d=np.dot(y,x)
#注意区分x*y与矩阵乘法
a=x*y
#数组广播,维度不匹配,扩展
x1=np.ones((3,3))
print(x1)
x2=np.arange(3).reshape(1,3)
print(x2)
a=x1+x2
print(a)
x1=np.arange(3).reshape(3,1)
x2=np.arange(3).reshape(1,3)
print(x1,"\r\n",x2 )
a=x1+x2
print(a )
##比较运算和掩码
x1=np.random.randint(100,size=(10,10))
print(x1 )
a=x1>50
print(a )
#计算有多少个x1>5的
b=np.sum(x1>5)
print(b )
#所有都大于等于0,返回真假
a=np.all(x1>=0)
print(a )
#至少有一个是等于6的
a=np.any(x1==6)
print(a )
#每行元素大于9的判断,axis=0就是列
a=np.all(x1>9,axis=1)
print(a )
#
a=(x1<80)&(x1>10)
b=np.sum(a )
print(a,b)
#布尔数组作为掩码
x1=np.array([[1,4,2,9],[8,8,2,4],[9,5,3,6]])
print(x1)
a=x1>1
b=x1[x1>1]
print(a)
print(b)
##花哨的索引
x=np.random.randint(100,size=10)
print(x)
a=[2,6,9]
b=x[a]
print(b)
a=np.array([[1,0],[2,3]])
b=x[a]
print(b)
#多维数组
x=np.arange(12).reshape(3,4)
print(x )
r=np.array([0,1,2])
c=np.array([1,3,0])
a=x[r,c]
print(a)
a=r[:,np.newaxis]
print(a)
b=x[a,c]
print(b)
#(这里用到了广播机制的原理)
##其他numpy通用函数
x=np.random.randint(20,50,size=10)
print(x)
#数组排序
a=np.sort(x)
print(x)
print(a)
#原始数组发生变化
x.sort()
print(x)
#返回位置索引信息
i=np.argsort(x)
print(i)
#最大最小值
m=np.max(x)
print(m)
m=np.min(x)
print(m)
n=argmax(x )
print(n)
n=argmin(x)
print(n)
#数值求和求积
x=np.arange(1,6)
print(x )
a=np.sum(x )
print(a)
x=np.arange(6).reshape(2,3)
print(x )
a=np.sum(x,axis=1)
print(a)
a=np.sum(x,axis=0)
print(a)
x=np.array([1,2,3])
a=x.prod()
print(a)
#中位数
x=np.random.normal(1,2,size=1000)
a=np.median(x)
print(a)
#均值
a=np.mean(x)
print(a)
#方差
a=np.var(x)
print(a )
#标准差
a=x.std()
print(a)