Numpy学习笔记
来源:互联网 发布:c语言中随机函数 编辑:程序博客网 时间:2024/06/05 20:16
- 基于Wes McKinney的Python for Data Analysis第四章NumPy Basics: Arrays and Vectorized Computation整理代码得来。
最近在自学Python,感觉还是要敲一下的,又懒得在书上做笔记,所以在Notebook上写写喽。 - 有需要的尽管参考~谢谢
import numpy as np
#通过np.array()用list创建一维数组#list是用[]括起来的,元素之间用逗号data1 = [6,7.5,8,0,1]arr1 = np.array(data1)print arr1type(data1)
[ 6. 7.5 8. 0. 1. ]list
#通过np.array()用list创建二维数组#list是用[]括起来的,每行是一个[],不同行之间用逗号data2 = [[1,2,3,4],[5,6,7,8]]arr2 = np.array(data2)print arr2
[[1 2 3 4] [5 6 7 8]]
#查看数组的位数和形状以及数据类型print arr2.shapeprint arr2.ndimprint arr1.dtypeprint arr2.dtype
(2, 4)2float64int64
#可以通过制定dtype来强制显性规定数组内元素的数据类型
#可以用过np.asdtype来转换ndarray里面的元素的数据类型,如果非数字类型的list强制转化会报错
"""通过numpy的函数来新建数组"""print '全是0的五位数组:',np.zeros(5)print '全是1的五维数组:',np.ones(5)print '全是0的3*3数组:',np.zeros((3,3))print '全是1的3*3数组:',np.ones((3,3))print '全是1的3*3*3数组:',np.ones((2,2,2))print np.empty((3,3))print np.ones_like(arr2)#生成一个维度如同括号内数组的全是0的数组,传入的参数为ndarry格式print np.zeros_like(arr2)print np.eye(3)#产生单位矩阵,输入参数为阶数print np.arange(10)print np.arange(1,10,2)#np.arange(开始,结束,步长),其中开始可以省略(默认为0)步长可以省略(默认为1)#如果想产生从大到小的数组可以通过如下的方式产生print np.arange(10,0,-1)
全是0的五位数组: [ 0. 0. 0. 0. 0.]全是1的五维数组: [ 1. 1. 1. 1. 1.]全是0的3*3数组: [[ 0. 0. 0.] [ 0. 0. 0.] [ 0. 0. 0.]]全是1的3*3数组: [[ 1. 1. 1.] [ 1. 1. 1.] [ 1. 1. 1.]]全是1的3*3*3数组: [[[ 1. 1.] [ 1. 1.]] [[ 1. 1.] [ 1. 1.]]][[ 1. 1. 1.] [ 1. 1. 1.] [ 1. 1. 1.]][[1 1 1 1] [1 1 1 1]][[0 0 0 0] [0 0 0 0]][[ 1. 0. 0.] [ 0. 1. 0.] [ 0. 0. 1.]][0 1 2 3 4 5 6 7 8 9][1 3 5 7 9][10 9 8 7 6 5 4 3 2 1]
'''数组的运算'''arr = np.array([[1.,2.,3.],[4.,5.,6.]])print("The square of arr is :",arr*arr)print("1/arr = ",1/arr)print("arr-arr:",arr-arr)print("A half of arr is :",arr*0.5)
('The square of arr is :', array([[ 1., 4., 9.], [ 16., 25., 36.]]))('1/arr = ', array([[ 1. , 0.5 , 0.33333333], [ 0.25 , 0.2 , 0.16666667]]))('arr-arr:', array([[ 0., 0., 0.], [ 0., 0., 0.]]))('A half of arr is :', array([[ 0.5, 1. , 1.5], [ 2. , 2.5, 3. ]]))
'''切片和索引:一维数组'''#np.arange()函数是range内置函数的array版本arr1 = np.arange(10)print arr1#同list的切片,index从0开始,arr[i]就是第i+1个元素print arr1[5]#这个就尴尬了,arr[i:j]表示从第i+1个元素开始向后数j-i个元素拿出来print arr1[5:8]#ndarray作为迭代器iteratorfor i in arr1: arr1[i]=10-i print arr1#切片后的部分还是原来array的一部分,如果对切片进行修改的话会影响到原有的array的#如果希望将切片后的array单独保存,可以使用array[].copy()
[0 1 2 3 4 5 6 7 8 9]5[5 6 7][10 9 8 7 6 5 4 3 2 1]
'''切片和索引:高维数组'''arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])#小括号里有两层中括号print arr2dprint arr2d[0][2]#等价于arr2d[0,2]arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])print print arr3dprint print arr3d[0]#三维数组的一个切片是一个二维数组
[[1 2 3] [4 5 6] [7 8 9]]3[[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]][[1 2 3] [4 5 6]]
#二维的array的切片如果仅仅有一个维度默认的是行向切片的,而且[:2]等价于[0:2]print arr2d[:2]#如果切片传入两个参数,第一个参数从行向切片,第二个从列向切片。最后切出来是个矩阵print arr2d[:2,1:]print arr2d[:,:1]
[[1 2 3] [4 5 6]][[2 3] [5 6]][[1] [4] [7]]
#Bool型索引names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])data = np.random.randn(7,4)names == 'Bob'#利用Bool数组对array进行切片,最后切出来的是第一行和第四行,因为只有这两行的Bool值为True#Bools的维度和array的需要切片的维度要相同,data[names == 'Bob']data[-(names == 'Bob')]#Bool值里面的逻辑运算 |或 &且 !=非 或者直接在前面加负号mask = (names == 'Bob')|(names == 'Will')data[mask]data[data<0] = 0print data
[[ 1.73468624 0.03652492 1.01359411 0.95894325] [ 0.24481808 0.10041709 0. 0. ] [ 0. 0.99979847 0. 0.37789161] [ 0.24150958 0.75716877 0. 0. ] [ 0.47633598 0.22929087 0. 0.91475764] [ 0. 0. 0.45932134 0.26343811] [ 0.80821826 0. 0. 0. ]]
#Fancy Indexingarr2 = np.empty((8,4))for i in range(8): arr2[i] = i print arr2#传入的list相当于给了一个顺序,指定切出array里面的第几行并按照list的顺序排列,如果list里面给的是负数,就从后往前数arr2[[4,3,0,6]]arr2[[-3,-5,-7]]
[[ 0. 0. 0. 0.] [ 1. 1. 1. 1.] [ 2. 2. 2. 2.] [ 3. 3. 3. 3.] [ 4. 4. 4. 4.] [ 5. 5. 5. 5.] [ 6. 6. 6. 6.] [ 7. 7. 7. 7.]]array([[ 5., 5., 5., 5.], [ 3., 3., 3., 3.], [ 1., 1., 1., 1.]])
#Fancy Indexing 2print "输出的是(1,0),(5,3)上面的元素"print arrr[[1,5,7,2],[0,3,1,2]]print "输出的是行列index交叉以后的元素,可以构成一个矩阵"print arrr[[1,5,7,2]][:,[0,3,1,2]]print "同上面的方法,用np.ix_函数"print arrr[np.ix_([1,5,7,2],[0,3,1,2])]
输出的是(1,0),(5,3)上面的元素---------------------------------------------------------------------------NameError Traceback (most recent call last)<mercury-input-12-DD1667028419416A87EC6CDDAC3F1604> in <module>() 1 #Fancy Indexing 2 2 print "输出的是(1,0),(5,3)上面的元素"----> 3 print arrr[[1,5,7,2],[0,3,1,2]] 4 print "输出的是行列index交叉以后的元素,可以构成一个矩阵" 5 print arrr[[1,5,7,2]][:,[0,3,1,2]]NameError: name 'arrr' is not defined
#数组transpose等等arrrr = np.arange(15).reshape((3,5))print arrrrprint "After transpose:"print arrrr.Tprint "内积的计算"print np.dot(arrrr.T,arrrr)#同时转置也可以用swapaxes函数print "用swapaxes进行二维数组的转置"print arrrr.swapaxes(1,1)
#Numpy里的通用函数ar = np.arange(10)print "平方根",np.sqrt(ar)print "自然对数",np.exp(ar)x = np.random.randn(8)y = np.random.randn(8)print "x=",xprint "y=",yprint "同位置元素最大的构成的array",np.maximum(x,y)print "np.modf用于返回一个array的整数部分和小数部分,返回两个数组",np.modf(x)print np.power(x,y)#相当于x的y次方print np.add(x,y)#加法的array版本print np.subtract(x,y)#减法的array版本print np.multiply(x,y)#乘法的array版本print np.divide(x,y)#除法的array版本print np.floor_divide(x,y)#丢弃余数的除法#此外还有一系列比较大小的运算函数,此外还有np.logical系列用于逻辑运算
#利用array进行数据处理points = np.arange(15,5,0.01)xs,ys = np.meshgrid(points,points)import matplotlib.pyplot as pltz = np.sqrt(xs ** 2 + ys ** 2)plt.imshow(z,cmap=plt.cm.gray);plt.colorbar()plt.title("Image plot of $\sqrt{x^2+y^2}$ for a grid of values")
#利用数组进行逻辑运算xarr = np.array([1.1,1.2,1.3,1.4,1.5])yarr = np.array([2.1,2.2,2.3,2.4,2.5])cond = np.array([True,False,True,True,False])print "如果cond里是True就输出xarr里的元素否则输出yarr里的:"print [(x if c else y) for x,y,c in zip(xarr,yarr,cond)]print "如果用np.where(cond,x,y)处理的话是相同的方法:"print np.where(cond,xarr,yarr)zarr = np.random.randn(4,4)print zarrprint "如果元素大于0输出2,否则输出-2"print np.where(zarr >0,2,-2)print "如果元素大于0则输出2,否则保留原值"print np.where(zarr>0,2,zarr)#np.where的嵌套:np.where(cond1&cond2,0,np.where(cond1,1,np.where(cond2,2,3)))#更复杂的形式是 result = 1*(cond1 -cond2)+2*(cond2& -cond1) +3*-(cond1|cond2) 虽然有点烧脑 但是还是可以看明白的#这就提醒我们不能为了装逼把代码写的太短别人看起来烧脑
1#数学统计学中的应用2arr3 = np.random.randn(5,4)3print "原随机数矩阵"4print arr35print "所有元素的平均数:",arr3.mean()6print "每一列元素的均值,axis=0表示行:",arr3.mean(axis=1)7print "所有元素的和,同理括号里传入参数1表示每列所有元素的和,传入参数0表示每行所有元素的和:",arr3.sum()8print "所有行元素的累加,也就是第二行所有元素等于第一行加第二行的和:"9print arr3.cumsum(0)10print "所有列元素的累加"11print arr3.cumsum(1)12print "所行元素的累乘:"13print arr3.cumprod(0)14print "所有列元素的累乘:"15print arr3.cumprod(1)16print "计算标准差方差,同理可以传入参数来计算行或者列的标准差方差,可以通过传入ddof=来指定自由度,比如样本方差估计中的n-1"17print "标准差:",arr3.std(),"方差:",arr3.var()18print "样本方差",np.var(arr3,ddof=1)19print "np.argmax与np.argmin分别返回一个array中最大元素和最小元素的index,同理传入0位行1位列,以行为例,输出的array的维度等于列的维度,同时会标明是第几行。列同理。如果不拉成任何参数就是拉成一维的数数。"20print arr3.argmax()21print arr3.argmax(1)22print arr3.argmax(0)23print arr3.argmin()24print arr3.argmin(1)25print arr3.argmin(0)26print "一定记住1行0列啊!!重要的事情说三遍但我懒得打字三遍了"
#Bool数组的方法arr4 = np.random.randn(100)print "arr4里面大于0的数字的个数:",(arr4>0).sum()bools = np.array([True,False,True,False])print "Bools数组中是否有非零值:",bools.any()print "Bools数组中是否全是非零值:",bools.all()#any()和all()还可以用于非Bool数组,用来检测array里面是不是有0元素
#一维数组排序arr5 = np.random.randn(5)print arr5arr5.sort()print arr5#多位数字按轴排序print "如果sort()里面传入的参数为1,说明是按照大小顺序把每一行排列,如果里面传入的参数为0说明把每一列按照大小顺序排列"printarr6 = np.random.randn(4,4)print "排序前:"print arr6arr6.sort(1)print "按行排序后:"print arr6printprint "应用:计算一个array的分位数"large_arr = np.random.randn(10000)large_arr.sort()printprint "计算一个1000个正态随机数的5%分位数,其中int函数表示取整"print "large_arr[int(0.05*len(large_arr))]"large_arr[int(0.05*len(large_arr))]
#还有一些其余的逻辑运算不再举例#unique() 计算x中的唯一元素,返回一个有序的结果#intersect1d(x,y) 计算xy中的公共元素,相当于取交集#union(x,y) 计算xy的并集#in1d(x,y) 表示在x的元素是否也在y中,返回Bool数组#setdiff1d(x,y) 计算集合的差 相当于在x中且不在y中#setxor1d(x,y) 集合的对称差 存在于其中某集合中但不同时存在于两个集合中
#Numpy文件的存取也是以array为基础#函数分别是np.save('path',array_name) path是保存的路径,name是要储存的array的名字#数组的读取用np.load("path")#np.savez可以将多个数组保存到一个压缩文件里,加载时候会变成一个dict对象,对dict切片得到array
#Numpy在线性代数中的应用2x = np.array([[1,2,3],[4,5,6]])3y = np.array([[6,23],[-1,7],[8,9]])4print np.dot(x,y)#x.dot(y)5print6print np.dot(x,np.ones(3))7from numpy import linalg#用于线性代数的pack8X = np.random.randn(5,5)9print "X的内积:"10print X.T.dot(X)11print "x的内积的逆:"12print linalg.inv(X.T.dot(X))13print "矩阵的QR分解:"14q,r = linalg.qr(X.T.dot(X))15print "Q:"16print q17print "R:"18print r19#linalg里面还有很多很强大的线性代数的函数20#dot表示矩阵乘法,语法为x.dot(y)或者dot(x,y)这里的xy是要注意顺序的21#trace计算矩阵的迹 det为计算行列式22#eig表示计算矩阵的特征值和特征向量,这是个返回两个参数的函数,第一个是特征值第二个是特征向量,要注意这里的输入必须是方阵23#svd表示计算矩阵的奇异值分解24#solve表示求解Ax=b的线性方程组,其中A是一个方阵25#lstsq表示求解Ax=b的最小二乘解,用于超定方程
#Numpy的随机数生成#生成一组4*4的标准正态分布的随机数samples = np.random.normal(size=(4,4))print samples#np.random里面部分函数的说明#seed生成随机数的种子#shuffle对一个序列进行随机排序#rand返回均匀分布的序列#randint指定上下限选取整数#randn标准正态分布#binomial/normal/beta/chisquare/gamma/uniform分别表示各自的分布下选取随机数
#随机数的应用:生成随机游走的序列2nsteps = 10003draws = np.random.randint(0,2,size = nsteps)4steps = np.where(draws>0,1,-1)5walks = steps.cumsum()6print walks.min()7print walks.max()8print (np.abs(walks) >= 10).argmax()#找出这个随机游走在10的时候的首达时910#一次模拟多个随机游走11nwalks = 500012nsteps = 100013draws = np.random.randint(0,2,size=(nwalks,nsteps))14steps = np.where(draws>0,1,-1)15walks = steps.cumsum(1)16print walks17#计算以上随机游走穿越30或者-30的最小时间,不是让这5000个都穿越,所以我们用any函数18hits30 = (np.abs(walks)>=30).any(1)19print "各个随机游走是否到达了距离原点30的位置:",hits3020print "5000个随机游走里一共有几个到达了30:",hits30.sum()2122crossing_times = (np.abs(walks[hits30])>=30).argmax(1)23print crossing_times.mean()2425#同时可以用其他的分布生成随机游走26#例如steps = np.random.normal(loc=0,scale=0.25,size = (nsteps,nwalks))
-112227[[ 1 0 1 ..., -10 -11 -12] [ -1 0 -1 ..., -40 -39 -40] [ 1 2 3 ..., 26 25 24] ..., [ -1 -2 -1 ..., 4 5 6] [ 1 0 1 ..., -16 -17 -16] [ -1 -2 -1 ..., 10 11 12]]各个随机游走是否到达了距离原点30的位置: [False True True ..., False True True]5000个随机游走里一共有几个到达了30: 3428507.378646441
0 0
- NumPy学习笔记(1)
- NumPy学习笔记 (2)
- NumPy学习笔记 (3)
- NumPy学习笔记 (4)
- NumPy学习笔记
- numpy学习笔记
- NumPy学习笔记
- NumPY学习笔记
- 【python】numpy学习笔记
- Numpy 学习笔记一
- NumPy学习笔记1
- NumPy学习笔记2
- NumPy学习笔记
- NumPy学习笔记
- [NumPy]入门-学习笔记
- numpy学习笔记
- numpy入门学习笔记
- NumPy学习笔记
- Ubuntu下安装VirtualBox
- Error running app: This version of Android Studio is incompatible with the Gradle Plugin used.
- CSS3笔记之第二天
- CFW_DEMO 屏幕上添加 图片、按钮、文本编辑、HTML
- 解决使用BadgeView导致视图显示错误的问题
- Numpy学习笔记
- 推送SD K信鸽推送 和 个推推送 调研对比
- 【转】SQL Server索引中的碎片和填充因子
- 关于EditText获取焦点,是否弹出软键盘的那些事
- 一侧监听无法连接 12537处理
- Windows+Apache+Python配置(modpython)
- 在本地环境下搭建wordpress的数据库配置方法
- javascript线程相关
- 机会在哪里?