二、ufunc函数
-
ufunc
函数是对数组的每个元素进行运算的函数。numpy
很多内置的ufunc
函数使用C
语言实现的,计算速度非常快。 -
基本上所有的
ufunc
函数可以指定一个out
参数来保存计算结果数组,并返回out
数组。同时如果未指定out
参数,则创建新的数组来保存计算结果。 如果你指定了out
参数,则要求out
数组与计算结果兼容。即:数组的尺寸要严格匹配,并且数组的dtype
要匹配。
-
numpy
的某些ufunc
函数,如numpy.sin()
,支持计算单个数值。但是在单个数值的计算速度上,python
的math.sin()
要快得多。两个原因:numpy.sin()
为了同时支持数组和单个数值运算,其C
语言的内部实现要比math.sin()
复杂- 单个数值的计算上:
numpy.sin()
返回的是numpy.float64
类型,而math.sin()
返回的是python
的标准float
类型
1.广播
当使用ufunc
函数对两个数组进行计算时,ufunc
函数会对这两个数组的对应元素进行计算。这就要求这两个数组的形状相同。如果这两个数组的形状不同,就通过广播broadcasting
进行处理:
- 首先让所有输入数组都向其中维度最高的数组看齐。看齐方式为:在
shape
属性的左侧插入数字1
- 然后输出数组的
shape
属性是输入数组的shape
属性的各轴上的最大值 - 如果输入数组的某个轴的长度为 1,或者与输出数组的各对应轴的长度相同,该数组能正确广播。否则计算出错
- 当输入数组的某个轴的长度为 1时,沿着此轴运算时都用此轴上的第一组值。
可以通过numpy.broadcast_arrays()
查看广播之后的数组。
可见,广播后都变成(4,4)数组。
可以通过ndarray.repeat()
方法来手动重复某个轴上的值.其用法为ndarray.repeat(repeats, axis=None)
,其中:
repeats
为重复次数axis
指定被重复的轴,即沿着哪一轴重复。如果未指定,则将数组展平然后重复。返回的也是一个展平的数组
被重复的是该轴的每一组值。
4、 numpy
提供了ogrid
对象,用于创建广播运算用的数组。ogrid
对象像多维数组一样,使用切片元组作为下标,返回的是一组可以用于广播计算的数组。其切片有两种形式:
- 开始值:结束值:步长。它指定返回数组的开始值和结束值(不包括)。默认的开始值为 0;默认的步长为 1。与
np.arange
类似 - 开始值:结束值:长度 j。当第三个参数为虚数时,表示返回的数组的长度。与
np.linspace
类似。 - 有多少个下标,则结果就是多少维的,同时也返回相应数量的数组。每个返回的数组只有某一维度长度大于1,其他维度的长度全部为 1。假设下标元组长度为3,则结果元组中:第一个数组的
shape=(3,1,1)
,第二个数组的shape=(1,3,1)
,第三个数组的shape=(1,1,3)
。
numpy
还提供了mgrid
对象,它类似于ogrid
对象。但是它返回的是广播之后的数组,而不是广播之前的数组。
numpy
提供了meshgrid()
函数,其用法为:numpy.meshgrid(x1,x2,...xn)
。其中xi
是都是一维数组。返回一个元组 (X1,X2,...Xn)
,是广播之后的数组。假设xi
的长度为 li
,则返回元组的每个数组的形状都是(ln,ln-1,......l2,l1)。
numpy.ix_()
函数可以将N
个一维数组转换成可广播的N
维数组。其用法为numpy.ix_(x1,x2,x3)
,返回一个元组。元组元素分别为对应的可广播的N
维数组。
-
返回的是广播前的数组,而不是广播后的数组
-
每个转换前的一维数组,对应了一个转换后的
N
维数组 -
-
总结
摘自网络,侵删;