|
- #Bool数组的方法
- 2
- arr4 = np.random.randn(100)
- 3
- print "arr4里面大于0的数字的个数:",(arr4>0).sum()
- 4
- bools = np.array([True,False,True,False])
- 5
- print "Bools数组中是否有非零值:",bools.any()
- 6
- print "Bools数组中是否全是非零值:",bools.all()
- 7
- #any()和all()还可以用于非Bool数组,用来检测array里面是不是有0元素
复制代码- #一维数组排序
- arr5 = np.random.randn(5)
- print arr5
- arr5.sort()
- print arr5
- #多位数字按轴排序
- print "如果sort()里面传入的参数为1,说明是按照大小顺序把每一行排列,如果里面传入的参数为0说明把每一列按照大小顺序排列"
- print
- arr6 = np.random.randn(4,4)
- print "排序前:"
- print arr6
- arr6.sort(1)
- print "按行排序后:"
- print arr6
- print
- print "应用:计算一个array的分位数"
- large_arr = np.random.randn(10000)
- large_arr.sort()
- print
- print "计算一个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在线性代数中的应用
- x = np.array([[1,2,3],[4,5,6]])
- y = np.array([[6,23],[-1,7],[8,9]])
- print np.dot(x,y)#x.dot(y)
- print
- print np.dot(x,np.ones(3))
- from numpy import linalg#用于线性代数的pack
- X = np.random.randn(5,5)
- print "X的内积:"
- print X.T.dot(X)
- print "x的内积的逆:"
- print linalg.inv(X.T.dot(X))
- print "矩阵的QR分解:"
- q,r = linalg.qr(X.T.dot(X))
- print "Q:"
- print q
- print "R:"
- print r
- #linalg里面还有很多很强大的线性代数的函数
- #dot表示矩阵乘法,语法为x.dot(y)或者dot(x,y)这里的xy是要注意顺序的
- #trace计算矩阵的迹 det为计算行列式
- #eig表示计算矩阵的特征值和特征向量,这是个返回两个参数的函数,第一个是特征值第二个是特征向量,要注意这里的输入必须是方阵
- #svd表示计算矩阵的奇异值分解
- #solve表示求解Ax=b的线性方程组,其中A是一个方阵
- #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分别表示各自的分布下选取随机数
复制代码- #随机数的应用:生成随机游走的序列
- nsteps = 1000
- draws = np.random.randint(0,2,size = nsteps)
- steps = np.where(draws>0,1,-1)
- walks = steps.cumsum()
- print walks.min()
- print walks.max()
- print (np.abs(walks) >= 10).argmax()#找出这个随机游走在10的时候的首达时
- #一次模拟多个随机游走
- nwalks = 5000
- nsteps = 1000
- draws = np.random.randint(0,2,size=(nwalks,nsteps))
- steps = np.where(draws>0,1,-1)
- walks = steps.cumsum(1)
- print walks
- #计算以上随机游走穿越30或者-30的最小时间,不是让这5000个都穿越,所以我们用any函数
- hits30 = (np.abs(walks)>=30).any(1)
- print "各个随机游走是否到达了距离原点30的位置:",hits30
- print "5000个随机游走里一共有几个到达了30:",hits30.sum()
- crossing_times = (np.abs(walks[hits30])>=30).argmax(1)
- print crossing_times.mean()
- #同时可以用其他的分布生成随机游走
- #例如steps = np.random.normal(loc=0,scale=0.25,size = (nsteps,nwalks))
复制代码 -11
2227[[ 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
|
|