《python科学技算》之Numpy 广播;ufunc函数的方法

天大地大妈咪最大 提交于 2020-03-25 14:48:10

1.Numpy包中的广播部分:

ufunc 函数会对两个数组的对应元素计算,要求俩数组形状相同,如果不同会进行广播处理。

广播处理即所有数组的shape向维数最多数组看齐,低维通过前面加1看齐,如一维的(5,),与二维看齐后为(1,5);只有当某个轴长度相同或为1才能计算

当输入数组的某个轴长度为1时,沿此轴运算时都用第一组的值

Numpy提供了快速生成广播运算数组的ogrid对象

x,y=np.ogrid[:5,:5]

还有一个mgrid对象与此相似,但返回的是已经广播后的数组

ogrid[]内有两种写法:

始:终:步长 or 始:终:长度j

如果已经有了两个一维数组x,y:

gy,gx=np.ix_(y,x)

注意此时y是0轴,x是1轴

2.ufunc函数的方法

这些方法只对两个输入一个输出的ufunc对象有效

<op>.reduce(array,axis=0,dtype=None)

reduce()方法相当于沿着axis指定的轴对数组进行操作,将<op>运算符插入到沿axis的所有元素中:

np.add.reduce([1,2,3])  #6
np.add.reduce([[1,2,3],[4,5,6]])  #[5,7,9], 默认axis=0,same with np.add([1,2,3],[4,5,6])
np.add.reduce([[1,2,3],[4,5,6]],axis=1)  #[6,15]

(在书p38-39有一些ufunc函数的表)

此外还有accumulate(),与reduce()类似,但返回和输入的数组形状相同,保存所有中间计算结果

np.add.accumulate([1,2,3])  #[1,3,6]

reduceat()计算多组reduce()结果,通过indices参数指定一系列的起始和终值位置

a=np.array([1,2,3,4])
np.add.reduceat(a,indices=[0,1,0,2,3,0])  #[1,2,3,3,6,4,10]

如果indices[i]<[i+1],则结果得到np.add.reduce(a[indices[i]:...[i+1]),不包括终值,反之得到a[indices[i]];最后一个元素由<op>.reduce(a[indices[-1]:])给出

outer()方法对两个参数数组进行组合运算,若a形状为(2,3),b(4,5),则输出数组形状为(2,3,4,5),与广播运算相似

np.multiply.outer([1,2,3,4,5],[2,3,4])
np.multily(np.array([1,2,3,4,5]).reshape(-1,1),[2,3,4])  #两者结果相同

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!