python基础知识(七)-Numpy

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的高级功能还包括多项式求解和拟合的功能。

猜你喜欢

转载自blog.csdn.net/qq_27584277/article/details/80590535