numpy 学习汇总19 - ufunc函数属性,方法,自定义,函数构造数组(详解 基础学习 tcy)
发布日期:2021-06-29 14:47:34 浏览次数:3 分类:技术文章

本文共 4976 字,大约阅读时间需要 16 分钟。

ufunc函数 2018/11/22 2018/11/28# ufunc是universal function的缩写,是一种能对数组中每个元素进行操作的函数。# Numpy内置的许多ufunc函数都是C语言实现的,计算速度非常快==============================================================================1.说明:计算单值建议采用Math库函数,np.sin( )对应math.sin( );对于数组元素,采用numpy库函读取ndarray数组中单个元素(下标获取转换为python标准类型耗时)a.item(1,2) #与a[1,2]类似2.ufunc函数属性方法 见备注==============================================================================3.编写自定义ufunc函数 运行非常慢# 基本形式u_func = np.frompyfunc(func, nin, nout,otypes=[dtype1,dtype2..]#返回np.objectu_func = np.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False,signature=None)# 第一步:定义函数def MyAdd(x,y):return x+y# 第二步:转换uMyAdd =np.frompyfunc(MyAdd,2,1)#返回np.object类型,需要用a=a.astype()转换为目的类型uMyAdd1=np.vectorize(MyAdd,otypes=[np.int])# 第三步:应用a=np.array([1,2,3])b=np.array([4,5,6])c=uMyAdd(a,b) # array([5, 7, 9], dtype=object)c=c.astype(np.int) # array([5, 7, 9])c.dtype # dtype('int32')d=uMyAdd1(a,b) # array([5, 7, 9])d.dtype # dtype('int32')备注:========================================================================1.ufunc函数参数out #输出where #布尔数组。True值表示计算该位置的ufunc,False值表示仅在输出中保留该值。axes #默认值是'same_kind'order #默认为'K'尽可能接近地匹配输入的元素排序。dtypekeepdims#True则减小的轴将作为尺寸为1的尺寸保留在结果中,只用于对输入操作通用ufuncsubok # 默认为true。如果设置为false,则输出将始终是严格的数组,而不是子类型。extobj #指定ufunc缓冲区大小2.ufunc属性(只读)np.add.__name__#函数名称 'add'np.add.__doc__ #函数文档np.add.nin #输入参数数量2np.add.nout #输出参数数量1np.add.nargs #参数数量3np.add.ntypes #类型数量22np.add.types #包含类型列表 [?,b,B,h,H,i,I,l,L,q,Q,e,f,d,g,F,D,G,M,m,M,O]np.add.identity #身份价值0np.add.signature#广义ufunc操作的核心元素的定义========================================================================3.ufunc方法# ufunc函数方法只对两个输入、一个输出的ufunc 函数有效,其他ufunc对象调用会ValueErrorufunc.reduce(a[, axis, dtype, out, keepdims])#按函数累计作用于每个元素ufunc.accumulate(array[, axis, dtype, out]) #数组元素累计计算ufunc.reduceat(a, indices[, axis, dtype, out]) #在单个轴上使用指定切片执行(局部)缩减ufunc.outer(A, B, **kwargs) #将a的每个元素依次作用于b:通过函数ufunc.at(a, indices[, b]) #对'index'指定的元素在操作数'a'上执行无缓冲的就地操作.(1). reduce()#沿着指定轴对数组进行操作,相当于将相应的操作放到该轴元素之间。np.add.reduce([1,2,3]) #1+2+3=6np.add.reduce([[1,2,3],[4,5,6]]) #[1+4,2+5,3+6]=[5,7,9]np.add.reduce([[1,2,3],[4,5,6]],axis=1) #[1+2+3,4+5+6]=[6,15](2). accumulate()#和reduce()类似会保留中间结果:np.add.accumulate([1,2,3]) #[1,1+2,1+2+3]=[1,3,6]np.add.accumulate([[1,2,3],[4,5,6]],axis=0) #array([[1, 2, 3],[5, 7, 9]], dtype=int32)np.add.accumulate([[1,2,3],[4,5,6]],axis=1) #array([[ 1, 3, 6],[ 4, 9, 15]], dtype=int32)(3). reduceat()方法计算多维reduce()的结果#参数indices=[start,end,...]指定一系列的起始和终止位置:# 对数据各切片进行聚合的group by运算#原理:if indices[i] < indices[i+1]:result[i] = 
.reduce(a[indices[i]:indices[i+1]])else:result[i] = a[indices[i]]#result[-1]的计算如下:
.reduce(a[indices[-1]:])# 例1:a = np.array([1, 2, 3, 4])result = np.add.reduceat(a, indices=[0, 1, 0, 2, 0, 3, 0])# array([1, 2, 3, 3, 6, 4, 10])# 计算过程如下:1: a[0:1] -> 12: a[1:0] -> 23: a[0:2] -> 1 + 24: a[2:0] -> 35: a[0:3] -> 1 + 2 + 3 = 66: a[3:0] -> 47: a[0:] - > 1 + 2 + 3 + 4 = 10# 例2:最终结果是在arr[0 :5 ],arr[5:8 ],arr[8:]上求和arr= np.arange(10) #array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])np.add.reduceat(arr, [0, 5, 8]) #array([10, 18, 17], dtype=int32)1: a[0:5] ->0+1+2+3+4=102: a[5:8] ->5+6+7=183: a[8: ] ->8+9=17(4) ufunc.outer 将a的每个元素依次作用于b:通过函数# 原理:C[i0,i1,...,i_m_1 ,j0,j1,...,j_n_1]=op(a[i0,i1,...,i_m_1],b[j0,j1,...,j_n_1])# 对于a和b一维,这相当于:r = empty(len(a),len(b))for i in range(len(a)):for j in range(len(b)):r[i,j] = op(a[i], b[j]) # op = ufunc in questionouter输出结果的维度是两个输入数据的维度之和a=np.array([1,2,3])b=np.array([4,5,6])np.add.outer(a,b)array([[5, 6, 7], #1+[4,5,6][6, 7, 8], #2+[4,5,6][7, 8, 9]])#3+[4,5,6]a=np.array([[1,2,3],[4,5,6]])b=np.array([[11,12,13],[14,15,16]])np.add.outer(a,b)array([[[[12, 13, 14], #1+[11,12,13][15, 16, 17]], #1+[14,15,16][[13, 14, 15], #2+[11,12,13][16, 17, 18]], #2+[14,15,16][[14, 15, 16], #3+[11,12,13][17, 18, 19]]], #3+[14,15,16][[[15, 16, 17], #4+[11,12,13][18, 19, 20]], #4+[14,15,16][[16, 17, 18], #5+[11,12,13][19, 20, 21]], #5+[14,15,16][[17, 18, 19], #6+[11,12,13][20, 21, 22]]]])#6+[14,15,16]=====================================================================备注4:函数构造数组np.fromfunction(function, shape, **kwargs)#函数构造数组,参数为网格位置# 说明:i,j代表0---m,0---n;数组a的元素是函数的计算结果# 实例:np.fromfunction(lambda i, j: i, (3, 4), dtype=int)#行参数依次为0,1,2# array([[0, 0, 0, 0],[1, 1, 1, 1],[2, 2, 2, 2]])np.fromfunction(lambda i, j: j, (3, 4), dtype=int)#列参数依次为0,1,2,3# array([[0, 1, 2, 3], [0, 1, 2, 3],[0, 1, 2, 3]])np.fromfunction(lambda i, j: i == j, (2, 2), dtype=int)# array([[ True, False],[False, True]])np.fromfunction(lambda i, j: i + j, (2, 2), dtype=int)# array([[0, 1], [1, 2]])def func(i, j):return (i+1)*10+(j+1)np.fromfunction(func, (2,6))# array([[11., 12., 13., 14., 15., 16.],[21., 22., 23., 24., 25., 26.]])=====================================================================================
No 函数 说明
1 reduce(x)  通过连续执行原始运算的方式对值进行聚合
2 accumulate(x)  聚合值,保留所有局部聚合结果
3 reduceat(x, bins) 局部约简(也就是groupby )约简数据的各个切片以产生聚合型数组
4 outer(x, y)  对x和y中的每对元素应用原始运算。结果数组的形状为x.shape +y.shape

转载地址:https://chunyou.blog.csdn.net/article/details/84349436 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:numpy 学习汇总21 - 循环迭代a.data,np.flat,np.nditer(详解 基础学习 tcy)
下一篇:numpy 学习汇总18 - 数学运算 (集合,复数)( 基础学习 tcy)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月17日 22时00分23秒