Numpy是Python做数据分析所必须要掌握的基础库之一,以下题是github上的开源项目,主要为了检测你的Numpy能力,同时对你的学习作为一个补充。
(提示:import…as…)
importnumpyasnp
2.打印输出numpy的版本和配置信息(★☆☆)
(提示:np.version,np.show_config)
print(np.__version__)print(np.show_config())
3.创建一个长度为10的空向量(★☆☆)
(提示:np.zeros)
Z=np.zeros(10)print(Z)
4.如何找到任何一个数组的内存大小?(★☆☆)
(提示:size,itemsize)
Z=np.zeros((10,10))print("%dbytes"%(Z.size*Z.itemsize))
5.如何从命令行得到numpy中add函数的说明文档(★☆☆)
(提示:np.info)
importnumpynumpy.info(numpy.add)
6.创建一个长度为10并且除了第五个值为1的空向量(★☆☆)
(提示:array[4])
Z=np.zeros(10)Z[4]=1print(Z)
7.创建一个值域范围从10到49的向量(★☆☆)
(提示:np.arange)
Z=np.arange(10,50)print(Z)
8.反转一个向量(第一个元素变为最后一个)(★☆☆)
(提示:array[::-1])
Z=np.arange(50)Z=Z[::-1]print(Z)
9.创建一个3x3并且值从0到8的矩阵(★☆☆)
(提示:reshape)
Z=np.arange(9).reshape(3,3)print(Z)
10.找到数组[1,2,0,0,4,0]中非0元素的位置索引(★☆☆)
(提示:np.nonzero)
nz=np.nonzero([1,2,0,0,4,0])print(nz)
11.创建一个3x3的单位矩阵(★☆☆)
(提示:np.eye)
Z=np.eye(3)print(Z)
12.创建一个3x3x3的随机数组(★☆☆)
(提示:np.random.random)
Z=np.random.random((3,3,3))print(Z)
13.创建一个10x10的随机数组并找到它的最大值和最小值(★☆☆)
(提示:min,max)
Z=np.random.random((10,10))Zmin,Zmax=Z.min(),Z.max()print(Zmin,Zmax)
14.创建一个长度为30的随机向量并找到它的平均值(★☆☆)
(提示:mean)
Z=np.random.random(30)m=Z.mean()print(m)
15.创建一个二维数组,其中边界值为1,其余值为0(★☆☆)
(提示:array[1:-1,1:-1])
Z=np.ones((10,10))Z[1:-1,1:-1]=0print(Z)
16.对于一个存在在数组,如何添加一个用0填充的边界(★☆☆)
(提示:np.pad)
Z=np.ones((5,5))Z=np.pad(Z,pad_width=1,mode='constant',constant_values=0)print(Z)
17.下面表达式运行的结果是什么?(★☆☆)
(提示:NaN=notanumber,inf=infinity)(提示:NaN:不是一个数,inf:无穷)
#表达式#结果0*np.nannannp.nan==np.nanFalsenp.inf>np.nanFalsenp.nan-np.nannan0.3==3*0.1False
18.创建一个5x5的矩阵,并设置值1,2,3,4落在其对角线下方位置(★☆☆)
(提示:np.diag)
Z=np.diag(1+np.arange(4),k=-1)print(Z)
19.创建一个8x8的矩阵,并且设置成棋盘样式(★☆☆)
(提示:array[::2])
Z=np.zeros((8,8),dtype=int)Z[1::2,::2]=1Z[::2,1::2]=1print(Z)
20.考虑一个(6,7,8)形状的数组,其第100个元素的索引(x,y,z)是什么
(提示:np.unravel_index)
print(np.unravel_index(100,(6,7,8)))
21.用tile函数去创建一个8x8的棋盘样式矩阵(★☆☆)
(提示:np.tile)
Z=np.tile(np.array([[0,1],[1,0]]),(4,4))print(Z)
22.对一个5x5的随机矩阵做归一化(★☆☆)
(提示:(x-min)/(max-min))
Z=np.random.random((5,5))Zmax,Zmin=Z.max(),Z.min()Z=(Z-Zmin)/(Zmax-Zmin)print(Z)
23.创建一个将颜色描述为(RGBA)四个无符号字节的自定义dtype?(★☆☆)
(提示:np.dtype)
color=np.dtype([("r",np.ubyte,1),("g",np.ubyte,1),("b",np.ubyte,1),("a",np.ubyte,1)])color
24.一个5x3的矩阵与一个3x2的矩阵相乘,实矩阵乘积是什么?(★☆☆)
(提示:np.dot|@)
Z=np.dot(np.ones((5,3)),np.ones((3,2)))print(Z)
25.给定一个一维数组,对其在3到8之间的所有元素取反(★☆☆)
(提示:>,<=)
Z=np.arange(11)Z[(3 26.下面脚本运行后的结果是什么(★☆☆) (提示:np.sum) #Author:JakeVanderPlas#结果 print(sum(range(5),-1))9fromnumpyimport*print(sum(range(5),-1))10#numpy.sum(a,axis=None) 27.考虑一个整数向量Z,下列表达合法的是哪个(★☆☆) (提示:这里还有“位运算符”) Z**ZTrue2< 28.下面表达式的结果分别是什么?(★☆☆) np.array(0)/np.array(0)nannp.array(0)//np.array(0)0np.array([np.nan]).astype(int).astype(float)-2.14748365e+09 29.如何从零位开始舍入浮点数组?(★☆☆) (提示:np.uniform,np.copysign,np.ceil,np.abs) #Author:CharlesRHarris Z=np.random.uniform(-10,+10,10)print(np.copysign(np.ceil(np.abs(Z)),Z)) 30.如何找出两个数组公共的元素(★☆☆) (提示:np.intersect1d) Z1=np.random.randint(0,10,10)Z2=np.random.randint(0,10,10)print(np.intersect1d(Z1,Z2)) 31.如何忽略所有的numpy警告(尽管不建议这么做)(★☆☆) (提示:np.seterr,np.errstate) #Suicidemodeondefaults=np.seterr(all="ignore")Z=np.ones(1)/0 #Backtosanity_=np.seterr(**defaults) #另一个等价的方式,使用上下文管理器(contextmanager)withnp.errstate(divide='ignore'):Z=np.ones(1)/0 32.下面的表达式是否为真(★☆☆) (提示:虚数) np.sqrt(-1)==np.emath.sqrt(-1)Faslse 33.如何获得昨天,今天和明天的日期(★☆☆) (提示:np.datetime64,np.timedelta64) yesterday=np.datetime64('today','D')-np.timedelta64(1,'D')today=np.datetime64('today','D')tomorrow=np.datetime64('today','D')+np.timedelta64(1,'D') 34.怎么获得所有与2016年7月的所有日期(★★☆) (提示:np.arange(dtype=datetime64['D'])) Z=np.arange('2016-07','2016-08',dtype='datetime64[D]')print(Z) 35.如何计算((A+B)*(-A/2))(不使用中间变量)(★★☆) (提示:np.add(out=),np.negative(out=),np.multiply(out=),np.divide(out=)) A=np.ones(3)*1B=np.ones(3)*1C=np.ones(3)*1np.add(A,B,out=B)np.divide(A,2,out=A)np.negative(A,out=A)np.multiply(A,B,out=A) 36.用5种不同的方法提取随机数组中的整数部分(★★☆) (提示:%,np.floor,np.ceil,astype,np.trunc) Z=np.random.uniform(0,10,10)print(Z-Z%1)print(np.floor(Z))print(np.cell(Z)-1)print(Z.astype(int))print(np.trunc(Z)) 37.创建一个5x5的矩阵且每一行的值范围为从0到4(★★☆) Z=np.zeros((5,5))Z+=np.arange(5)print(Z) 38.如何用一个生成10个整数的函数来构建数组(★☆☆) (提示:np.fromiter) defgenerate():forxinrange(10):yieldxZ=np.fromiter(generate(),dtype=float,count=-1)print(Z) 39.创建一个大小为10的向量,值域为0到1,不包括0和1(★★☆) (提示:np.linspace) Z=np.linspace(0,1,12,endpoint=True)[1:-1]print(Z) 40.创建一个大小为10的随机向量,并把它排序(★★☆) (提示:sort) Z=np.random.random(10)Z.sort()print(Z) 41.对一个小数组进行求和有没有办法比np.sum更快(★★☆) (提示:np.add.reduce) #Author:EvgeniBurovski Z=np.arange(10)np.add.reduce(Z) #np.add.reduce是numpy.add模块中的一个ufunc(universalfunction)函数,C语言实现 42.如何判断两和随机数组相等(★★☆) (提示:np.allclose,np.array_equal) A=np.random.randint(0,2,5)B=np.random.randint(0,2,5) #假设array的形状(shape)相同和一个误差容限(tolerance)equal=np.allclose(A,B)print(equal) #检查形状和元素值,没有误差容限(值必须完全相等)equal=np.array_equal(A,B)print(equal) 43.把数组变为只读(★★☆) (提示:flags.writeable) Z=np.zeros(5)Z.flags.writeable=FalseZ[0]=1 44.将一个10x2的笛卡尔坐标矩阵转换为极坐标(★★☆) (提示:np.sqrt,np.arctan2) Z=np.random.random((10,2))X,Y=Z[:,0],Z[:,1]R=np.sqrt(X**2+Y**2)T=np.arctan2(Y,X)print(R)print(T) 45.创建一个大小为10的随机向量并且将该向量中最大的值替换为0(★★☆) (提示:argmax) Z=np.random.random(10)Z[Z.argmax()]=0print(Z) 46.创建一个结构化数组,其中x和y坐标覆盖[0,1]x[1,0]区域(★★☆) (提示:np.meshgrid) Z=np.zeros((5,5),[('x',float),('y',float)])Z['x'],Z['y']=np.meshgrid(np.linspace(0,1,5),np.linspace(0,1,5))print(Z) 47.给定两个数组X和Y,构造柯西(Cauchy)矩阵C()(★★☆) (提示:np.subtract.outer) X=np.arange(8)Y=X+0.5C=1.0/np.subtract.outer(X,Y)print(C)print(np.linalg.det(C))#计算行列式 48.打印每个numpy类型的最小和最大可表示值(★★☆) (提示:np.iinfo,np.finfo,eps) fordtypein[np.int8,np.int32,np.int64]:print(np.iinfo(dtype).min)print(np.iinfo(dtype).max)fordtypein[np.float32,np.float64]:print(np.finfo(dtype).min)print(np.finfo(dtype).max)print(np.finfo(dtype).eps) 49.如何打印数组中所有的值?(★★☆) (提示:np.set_printoptions) np.set_printoptions(threshold=np.nan)Z=np.zeros((16,16))print(Z) 50.如何在数组中找到与给定标量接近的值(★★☆) (提示:argmin) Z=np.arange(100)v=np.random.uniform(0,100)index=(np.abs(Z-v)).argmin()print(Z[index]) 51.创建表示位置(x,y)和颜色(r,g,b,a)的结构化数组(★★☆) (提示:dtype) Z=np.zeros(10,[('position',[('x',float,1),('y',float,1)]),('color',[('r',float,1),('g',float,1),('b',float,1)])])print(Z) 52.思考形状为(100,2)的随机向量,求出点与点之间的距离(★★☆) (提示:np.atleast_2d,T,np.sqrt) Z=np.random.random((100,2))X,Y=np.atleast_2d(Z[:,0],Z[:,1])D=np.sqrt((X-X.T)**2+(Y-Y.T)**2)print(D) #使用scipy库可以更快importscipy.spatial Z=np.random.random((100,2))D=scipy.spatial.distance.cdist(Z,Z)print(D) 53.如何将类型为float(32位)的数组类型转换位integer(32位)(★★☆) (提示:astype(copy=False)) Z=np.arange(10,dtype=np.int32)Z=Z.astype(np.float32,copy=False)print(Z) 54.如何读取下面的文件(★★☆) (提示:np.genfromtxt) 1,2,3,4,56,,,7,8,,9,10,11 #先把上面保存到文件example.txt中#这里不使用StringIO,因为Python2和Python3在这个地方有兼容性问题Z=np.genfromtxt("example.txt",delimiter=",")print(Z) 55.numpy数组枚举(enumerate)的等价操作(★★☆) (提示:np.ndenumerate,np.ndindex) Z=np.arange(9).reshape(3,3)forindex,valueinnp.ndenumerate(Z):print(index,value)forindexinnp.ndindex(Z.shape):print(index,Z[index]) 56.构造一个二维高斯矩阵(★★☆) (提示:np.meshgrid,np.exp) X,Y=np.meshgrid(np.linspace(-1,1,10),np.linspace(-1,1,10))D=np.sqrt(X**2+Y**2)sigma,mu=1.0,0.0G=np.exp(-((D-mu)**2/(2.0*sigma**2)))print(G) 57.如何在二维数组的随机位置放置p个元素(★★☆) (提示:np.put,np.random.choice) #Author:Divakar n=10p=3Z=np.zeros((n,n))np.put(Z,np.random.choice(range(n*n),p,replace=False),1)print(Z) 58.减去矩阵每一行的平均值(★★☆) (提示:mean(axis=,keepdims=)) #Author:WarrenWeckesser X=np.random.rand(5,10) #新Y=X-X.mean(axis=1,keepdims=True) #旧Y=X-X.mean(axis=1).reshape(-1,1) print(Y) 59.如何对数组通过第n列进行排序(★★☆) (提示:argsort) #Author:SteveTjoa Z=np.random.randint(0,10,(3,3))print(Z)print(Z[Z[:,1].argsort()]) 60.如何判断一个给定的二维数组存在空列(★★☆) (提示:any,~) Z=np.random.randint(0,3,(3,10))print((~Z.any(axis=0)).any()) 61.从数组中找出与给定值最接近的值(★★☆) (提示:np.abs,argmin,flat) Z=np.random.uniform(0,1,10)z=0.5m=Z.flat[np.abs(Z-z).argmin()]print(m) 62.思考形状为(1,3)和(3,1)的两个数组形状,如何使用迭代器计算它们的和(★★☆) (提示:np.nditer) A=np.arange(3).reshape(3,1)B=np.arange(3).reshape(1,3)it=np.nditer([A,B,None])forx,y,zinit:z[...]=x+yprint(it.operands[2]) 63.创建一个具有name属性的数组类(★★☆) (提示:classmethod) classNameArray(np.ndarray):def__new__(cls,array,name="noname"):obj=np.asarray(array).view(cls)obj.name=namereturnobjdef__array_finalize__(self,obj):ifobjisNone:returnself.info=getattr(obj,'name',"noname") Z=NameArray(np.arange(10),"range_10")print(Z.name) 64.给定一个向量,如何让在第二个向量索引的每个元素加1(注意重复索引)(★★★) (提示:np.bincount|np.add.at) #Author:BrettOlsen Z=np.ones(10)I=np.random.randint(0,len(Z),20)Z+=np.bincount(I,minlength=len(Z))print(Z) #Anothersolution#Author:BartoszTelenczuknp.add.at(Z,I,1)print(Z) 65.如何根据索引列表I将向量X的元素累加到数组F(★★★) (提示:np.bincount) #Author:AlanGIsaac X=[1,2,3,4,5,6]I=[1,3,9,3,4,1]F=np.bincount(I,X)print(F) 66.思考(dtype=ubyte)的(w,h,3)图像,计算唯一颜色的值(★★★) (提示:np.unique) #Author:NadavHoresh w,h=16,16I=np.random.randint(0,2,(h,w,3)).astype(np.ubyte)F=I[...,0]*256*256+I[...,1]*256+I[...,2]n=len(np.unique(F))print(np.unique(I)) 67.思考如何求一个四维数组最后两个轴的数据和(★★★) (提示:sum(axis=(-2,-1))) A=np.random.randint(0,10,(3,4,3,4))#传递一个元组(numpy1.7.0)sum=A.sum(axis=(-2,-1))print(sum) #将最后两个维度压缩为一个#(适用于不接受轴元组参数的函数)sum=A.reshape(A.shape[:-2]+(-1,)).sum(axis=-1)print(sum) 68.考虑一维向量D,如何使用相同大小的向量S来计算D的子集的均值,其描述子集索引?(★★★) #Author:JaimeFernándezdelRío D=np.random.uniform(0,1,100)S=np.random.randint(0,10,100)D_sums=np.bincount(S,weights=D)D_counts=np.bincount(S)D_means=D_sums/D_countsprint(D_means) #Pandassolutionasareferenceduetomoreintuitivecodeimportpandasaspdprint(pd.Series(D).groupby(S).mean()) 69.如何获得点积的对角线?(★★★) #Author:MathieuBlondel A=np.random.uniform(0,1,(5,5))B=np.random.uniform(0,1,(5,5)) #Slowversionnp.diag(np.dot(A,B)) #Fastversionnp.sum(A*B.T,axis=1) #Fasterversionnp.einsum("ij,ji->i",A,B) 70.考虑向量[1,2,3,4,5],如何建立一个新的向量,在每个值之间交错有3个连续的零?(★★★) (提示:array[::4]) Z=np.array([1,2,3,4,5])nz=3Z0=np.zeros(len(Z)+(len(Z)-1)*(nz))Z0[::nz+1]=Zprint(Z0) 71.考虑一个维度(5,5,3)的数组,如何将其与一个(5,5)的数组相乘?(★★★) (提示:array[:,:,None]) A=np.ones((5,5,3))B=2*np.ones((5,5))print(A*B[:,:,None]) 72.如何对一个数组中任意两行做交换(★★★) (提示:array[[]]=array[[]]) #Author:EelcoHoogendoorn A=np.arange(25).reshape(5,5)A[[0,1]]=A[[1,0]]print(A) 73.思考描述10个三角形(共享顶点)的一组10个三元组,找到组成所有三角形的唯一线段集(★★★) (提示:repeat,np.roll,np.sort,view,np.unique) #Author:NicolasP.Rougier faces=np.random.randint(0,100,(10,3))F=np.roll(faces.repeat(2,axis=1),-1,axis=1)F=F.reshape(len(F)*3,2)F=np.sort(F,axis=1)G=F.view(dtype=[('p0',F.dtype),('p1',F.dtype)])G=np.unique(G)print(G) 74.给定一个二进制的数组C,如何生成一个数组A满足np.bincount(A)==C(★★★) (提示:np.repeat) C=np.bincount([1,1,2,3,4,4,6])A=np.repeat(np.arange(len(C)),C)print(A) 75.如何通过滑动窗口计算一个数组的平均数(★★★) (提示:np.cumsum) defmoving_average(a,n=3):ret=np.cumsum(a,dtype=float)ret[n:]=ret[n:]-ret[:-n]returnret[n-1:]/nZ=np.arange(20)print(moving_average(Z,n=3)) 76.思考以为数组Z,构建一个二维数组,其第一行是(Z[0],Z[1],Z[2]),然后每一行移动一位,最后一行为(Z[-3],Z[-2],Z[-1])(★★★) (提示:fromnumpy.libimportstride_tricks) #Author:JoeKington/ErikRigtorpfromnumpy.libimportstride_tricks defrolling(a,window):shape=(a.size-window+1,window)strides=(a.itemsize,a.itemsize)returnstride_tricks.as_strided(a,shape=shape,strides=strides)Z=rolling(np.arange(10),3)print(Z) 77.如何对布尔值取反,或改变浮点数的符号(sign)(★★★) (提示:np.logical_not,np.negative) #Author:NathanielJ.Smith Z=np.random.randint(0,2,100)np.logical_not(Z,out=Z) Z=np.random.uniform(-1.0,1.0,100)np.negative(Z,out=Z) 78.思考两组点集P0和P1去描述一组线(二维)和一个点p,如何计算点p到每一条线i(P0[i],P1[i])的距离?(★★★) defdistance(P0,P1,p):T=P1-P0L=(T**2).sum(axis=1)U=-((P0[:,0]-p[...,0])*T[:,0]+(P0[:,1]-p[...,1])*T[:,1])/LU=U.reshape(len(U),1)D=P0+U*T-preturnnp.sqrt((D**2).sum(axis=1)) P0=np.random.uniform(-10,10,(10,2))P1=np.random.uniform(-10,10,(10,2))p=np.random.uniform(-10,10,(1,2))print(distance(P0,P1,p)) 79.考虑两组点集P0和P1去描述一组线(二维)和一组点集P,如何计算每一个点j(P[j])到每一条线i(P0[i],P1[i])的距离(★★★) #Author:ItalmassovKuanysh #basedondistancefunctionfrompreviousquestionP0=np.random.uniform(-10,10,(10,2))P1=np.random.uniform(-10,10,(10,2))p=np.random.uniform(-10,10,(10,2))print(np.array([distance(P0,P1,p_i)forp_iinp])) 80.思考一个任意的数组,编写一个函数,该函数提取一个具有固定形状的子部分,并以一个给定的元素为中心(在该部分填充值)(★★★) (提示:minimum,maximum) #Author:NicolasRougier Z=np.random.randint(0,10,(10,10))shape=(5,5)fill=0position=(1,1) R=np.ones(shape,dtype=Z.dtype)*fillP=np.array(list(position)).astype(int)Rs=np.array(list(R.shape)).astype(int)Zs=np.array(list(Z.shape)).astype(int)R_start=np.zeros((len(shape),)).astype(int)R_stop=np.array(list(shape)).astype(int)Z_start=(P-Rs//2)Z_stop=(P+Rs//2)+Rs%2 R_start=(R_start-np.minimum(Z_start,0)).tolist()Z_start=(np.maximum(Z_start,0)).tolist()R_stop=np.maximum(R_start,(R_stop-np.maximum(Z_stop-Zs,0))).tolist()Z_stop=(np.minimum(Z_stop,Zs)).tolist() r=[slice(start,stop)forstart,stopinzip(R_start,R_stop)]z=[slice(start,stop)forstart,stopinzip(Z_start,Z_stop)]R[r]=Z[z]print(Z)print(R) 81.考虑一个数组Z=[1,2,3,4,5,6,7,8,9,10,11,12,13,14],如何生成一个数组R=[[1,2,3,4],[2,3,4,5],[3,4,5,6],...,[11,12,13,14]](★★★) (提示:stride_tricks.as_strided) #Author:StefanvanderWalt Z=np.arange(1,15,dtype=np.uint32)R=stride_tricks.as_strided(Z,(11,4),(4,4))print(R) 82.计算矩阵的秩(★★★) (提示:np.linalg.svd) Z=np.random.uniform(0,1,(10,10))U,S,V=np.linalg.svd(Z)#SingularValueDecompositionrank=np.sum(S>1e-10)print(rank) 83.如何找出数组中出现频率最高的值(★★★) (提示:np.bincount,argmax) Z=np.random.randint(0,10,50)print(np.bincount(Z).argmax()) 84.从一个10x10的矩阵中提取出连续的3x3区块(★★★) #Author:ChrisBarker Z=np.random.randint(0,5,(10,10))n=3i=1+(Z.shape[0]-3)j=1+(Z.shape[1]-3)C=stride_tricks.as_strided(Z,shape=(i,j,n,n),strides=Z.strides+Z.strides)print(C) 85.创建一个满足Z[i,j]==Z[j,i]的二维数组子类(★★★) #Author:EricO.Lebigot#Note:onlyworksfor2darrayandvaluesettingusingindices classSymetric(np.ndarray):def__setitem__(self,index,value):i,j=indexsuper(Symetric,self).__setitem__((i,j),value)super(Symetric,self).__setitem__((j,i),value) defsymetric(Z):returnnp.asarray(Z+Z.T-np.diag(Z.diagonal())).view(Symetric) S=symetric(np.random.randint(0,10,(5,5)))S[2,3]=42print(S) 86.考虑p个nxn矩阵和一组形状为(n,1)的向量,如何直接计算p个矩阵的乘积(n,1)(★★★) (提示:np.tensordot) p,n=10,20M=np.ones((p,n,n))V=np.ones((p,n,1))S=np.tensordot(M,V,axes=[[0,2],[0,1]])print(S) #Itworks,because:#Mis(p,n,n)#Vis(p,n,1)#Thus,summingoverthepairedaxes0and0(ofMandVindependently),#and2and1,toremainwitha(n,1)vector. 87.对于一个16x16的数组,如何得到一个区域的和(区域大小为4x4)(★★★) (提示:np.add.reduceat) #Author:RobertKern Z=np.ones((16,16))k=4S=np.add.reduceat(np.add.reduceat(Z,np.arange(0,Z.shape[0],k),axis=0),np.arange(0,Z.shape[1],k),axis=1)print(S) 88.如何利用numpy数组实现GameofLife(★★★) (提示:GameofLife,GameofLife有哪些图形?) defiterate(Z):#CountneighboursN=(Z[0:-2,0:-2]+Z[0:-2,1:-1]+Z[0:-2,2:]+Z[1:-1,0:-2]+Z[1:-1,2:]+Z[2:,0:-2]+Z[2:,1:-1]+Z[2:,2:]) #Applyrulesbirth=(N==3)&(Z[1:-1,1:-1]==0)survive=((N==2)|(N==3))&(Z[1:-1,1:-1]==1)Z[...]=0Z[1:-1,1:-1][birth|survive]=1returnZ Z=np.random.randint(0,2,(50,50))foriinrange(100):Z=iterate(Z)print(Z) 89.如何找到一个数组的第n个最大值(★★★) (提示:np.argsort|np.argpartition) Z=np.arange(10000)np.random.shuffle(Z)n=5 #Slowprint(Z[np.argsort(Z)[-n:]]) #Fastprint(Z[np.argpartition(-Z,n)[:n]]) 90.给定任意个数向量,创建笛卡尔积(每一个元素的每一种组合)(★★★) (提示:np.indices) #Author:StefanVanderWalt defcartesian(arrays):arrays=[np.asarray(a)forainarrays]shape=(len(x)forxinarrays) ix=np.indices(shape,dtype=int)ix=ix.reshape(len(arrays),-1).T forn,arrinenumerate(arrays):ix[:,n]=arrays[n][ix[:,n]] returnix print(cartesian(([1,2,3],[4,5],[6,7]))) 91.如何从一个常规数组中创建记录数组(recordarray)(★★★) (提示:np.core.records.fromarrays) Z=np.array([("Hello",2.5,3),("World",3.6,2)])R=np.core.records.fromarrays(Z.T,names='col1,col2,col3',formats='S8,f8,i8')print(R) 92.思考一个大向量Z,用三种不同的方法计算它的立方(★★★) (提示:np.power,*,np.einsum) #Author:RyanG. x=np.random.rand(5e7) %timeitnp.power(x,3)%timeitx*x*x%timeitnp.einsum('i,i,i->i',x,x,x) 93.考虑两个形状分别为(8,3)和(2,2)的数组A和B.如何在数组A中找到满足包含B中元素的行?(不考虑B中每行元素顺序)?(★★★) (提示:np.where) #Author:GabeSchwartz A=np.random.randint(0,5,(8,3))B=np.random.randint(0,5,(2,2)) C=(A[...,np.newaxis,np.newaxis]==B)rows=np.where(C.any((3,1)).all(1))[0]print(rows) 94.思考一个10x3的矩阵,如何分解出有不全相同值的行(如[2,2,3])(★★★) Z=np.random.randint(0,5,(10,3))print(Z)#solutionforarraysofalldtypes(includingstringarraysandrecordarrays)E=np.all(Z[:,1:]==Z[:,:-1],axis=1)U=Z[~E]print(U)#soluitonfornumericalarraysonly,willworkforanynumberofcolumnsinZU=Z[Z.max(axis=1)!=Z.min(axis=1),:]print(U) 95.将一个整数向量转换为二进制矩阵(★★★) (提示:np.unpackbits) I=np.array([0,1,2,3,15,16,32,64,128])B=((I.reshape(-1,1)&(2**np.arange(8)))!=0).astype(int)print(B[:,::-1]) #Author:DanielT.McDonald I=np.array([0,1,2,3,15,16,32,64,128],dtype=np.uint8)print(np.unpackbits(I[:,np.newaxis],axis=1)) 96.给定一个二维数组,如何提取出唯一的行(★★★) (提示:np.ascontiguousarray) Z=np.random.randint(0,2,(6,3))T=np.ascontiguousarray(Z).view(np.dtype((np.void,Z.dtype.itemsize*Z.shape[1])))_,idx=np.unique(T,return_index=True)uZ=Z[idx]print(uZ) 97.考虑两个向量A和B,写出用einsum等式对应的inner,outer,sum,mul函数(★★★) (提示:np.einsum) A=np.random.uniform(0,1,10)B=np.random.uniform(0,1,10) np.einsum('i->',A)#np.sum(A)np.einsum('i,i->i',A,B)#A*Bnp.einsum('i,i',A,B)#np.inner(A,B)np.einsum('i,j->ij',A,B)#np.outer(A,B) 98.考虑一个由两个向量描述的路径(X,Y),如何用等距样例(equidistantsamples)对其进行采样(sample)(★★★) (提示:np.cumsum,np.interp) #Author:BasSwinckels phi=np.arange(0,10*np.pi,0.1)a=1x=a*phi*np.cos(phi)y=a*phi*np.sin(phi) dr=(np.diff(x)**2+np.diff(y)**2)**.5#segmentlengthsr=np.zeros_like(x)r[1:]=np.cumsum(dr)#integratepathr_int=np.linspace(0,r.max(),200)#regularspacedpathx_int=np.interp(r_int,r,x)#integratepathy_int=np.interp(r_int,r,y) 99.给定一个整数n和一个二维数组X,从X中选择可以被解释为从多n度的多项分布式的行,即这些行只包含整数对n的和.(★★★) (提示:np.logical_and.reduce,np.mod) X=np.asarray([[1.0,0.0,3.0,8.0],[2.0,0.0,1.0,1.0],[1.5,2.5,1.0,0.0]])n=4M=np.logical_and.reduce(np.mod(X,1)==0,axis=-1)M&=(X.sum(axis=-1)==n)print(X[M]) 100.对于一个一维数组X,计算它boostrapped之后的95%置信区间的平均值.(★★★) (提示:np.percentile) #Author:JessicaB.Hamrick X=np.random.randn(100)#random1DarrayN=1000#numberofbootstrapsamplesidx=np.random.randint(0,X.size,(N,X.size))means=X[idx].mean(axis=1)confint=np.percentile(means,[2.5,97.5])print(confint)