Numpy是python科学计算的础库。
1 Numpy数组
#通过python列表或者Numpy函数来创建数组
import numpy as np
a=np.array([1,2,3,4])
print(a)
b=np.arange(10)
print(b)
c=np.array([[1,2],[3,4],[5,6]])
print(c)
d=np.linspace(0,2,3)
print(d)
e=np.ones((3,3))
print(e)
f=np.zeros((3,6))
print(f)
g=np.eye(4)
print(g)
h=np.random.randn(6,4)
print(h)
Numpy提供索引机制来访问数组内的元素
a=np.arange(10)
print(a[0],a[9],a[-1])
print(a[:4])#半开闭区间,不包含最后一个元素
print(a[2:4])
print(a[2:8:2])#三个参数分别表示为开始,结束,步长,不包含结束位置
print(a[2::2])#结束位置可以省略
print(a[::3])#开始和结束都可以省略
二维数据的索引分成行列两个维度。
a=np.arange(0,51,10).reshape(6,1)+np.arange(6)
print(a)
print(a[0,0],a[2,-1])
print(a[0,2:5])
print(a[:3,3:])
print(a[2,:])
print(a[:,3])#结果应该是列向量,但是Numpy自动转换为行向量形式
print(a[:,::2])
print(a[::2,::3])
#例外一个索引的方法是通过布尔数组,Numpy总是试图把结果转换为行变量
b=np.random.randint(10,20,6)
print(b)
b%2==0
print(a[b%2==0])
#在大多数情况下,Numpy是共享内存的,如果要独立保存,需要显式的备份。可以用np.may_share_memory()函数判断两个数组是否共享内存。
aa=np.arange(6)
bb=aa[2:5]
print(aa)
print(bb)
bb[1]=100
print(aa)
print(bb)
print(np.may_share_memory(aa,bb))
bbb=aa[2:6].copy()
print(bbb)
print(aa)
bbb[1]=666
print(bbb)
print(aa)
print(np.may_share_memory(aa,bbb))
2Numpy运算
#数组和标量运算
# a=np.arange(6)
# print(a+5)#数组和标量加法
# b=np.random.randint(1,5,20).reshape(4,5)
# print(b)
# print(b*3)#数组和标量乘法
#数组和数组运算
a=np.ones((5,4),dtype=int)
b=np.zeros((5,4),dtype=int)
print(a+b)
a=np.random.random_integers(1,10,size=(2,3))
print(a)
b=np.random.random_integers(1,10,size=(2,3))
print(b)
print(a*b)#数组相乘,逐元素相乘,不是矩阵内积运算
a=np.random.random_integers(1,5,(3,2))
print(a)
b=np.random.random_integers(1,5,(2,3))
print(b)
print(np.dot(a,b))#矩阵内积使用np.dot()函数
#如果数组的维度不同,则Numpy会试图使用广播机制来匹配,如果匹配的上就进行运算,不满足广播条件,则报错。
#5*4与1*4的加法满足广播条件
a=np.random.random_integers(1,5,(5,4))
print(a)
b=np.arange(4)
print(b)
print(a+b)
#5*4与1*5的加法不满足广播条件
a=np.random.random_integers(1,5,(5,4))
print(a)
b=np.arange(5)
print(b)
print(a+b)
#转换为5*1的列向量就满足广播条件
#符合广播的条件是两个数组必须有一个维度可以扩展,然后在这个维度上进行复制,最终复制出两个相同维度的数组,再进行运算。
c=np.arange(5).reshape(5,1)print(c)
print(a+c)
#Numpy还提供一些数组运算的内置函数
a=np.arange(5)
print(np.cos(a))
print(np.exp(a))
print(np.sqrt(a))
#Numpy提供一些基本的统计功能包括求和、求平均值,求方差。
a=np.random.random_integers(1,5,6)
print(a)
print(a.sum(),a.mean(),a.std(),a.max(),a.min(),a.argmin(),a.argmax())
#axis=0跨行,axis=1跨列,axis参数表示坐标轴,0表示按行计算,1表示按列计算。按列计算后,计算结果Numpy会默认转换为行向量。
b=np.random.random_integers(1,5,(6,4))
print(b)
print(b.sum())
print(b.sum(axis=0))
print(b.sum(axis=1))
print(b.sum(axis=0).sum())
print(b.min(axis=1))
print(b.argmin(axis=1))
print(b.std(axis=1))
#我们使用np.reshape()进行维度变换,而np.ravel()将多无数组摊平,变成一维向量。
a=np.arange(12)
print(a)
b=a.reshape(4,3)#转换为4*3的二维数组
print(b)
c=b.ravel()#变为一维向量
print(c)
#使用np.newaxis给数组添加一个维度。
a=np.arange(4)
print(a)
print(a.shape)
b=a[:,np.newaxis]#在列上添加一个维度,变成4*1数组
print(b)
print(b.shape)
c=a[np.newaxis,:]#在行上添加一个维度,变成1*4数组
print(c)
print(c.shape)
#Numpy提供数组排序的功能,可以按行单独排序,也可以按列单独排序。排序时,可以返回一个备份,也可以把排序后的结果保存在当前数组里。
a=np.random.random_integers(1,10,(6,4))
print(a)
b=np.sort(a,axis=1)
print(b)
c=np.sort(a,axis=0)
print(c)
#可以计算排序后的索引,利用排序后的索引可以直接获取排序后的数组
a=np.random.random_integers(1,10,6)
print(a)
idx=a.argsort()
print(a[idx])
#Numpy的高级功能还包括多项式求解和拟合的功能。