1. 广播
当使用
ufunc
函数对两个数组进行计算时,ufunc
函数会对这两个数组的对应元素进行计算。这就要求这两个数组的形状相同。如果这两个数组的形状不同,就通过广播broadcasting
进行处理:- 首先让所有输入数组都向其中维度最高的数组看齐。看齐方式为:在
shape
属性的左侧插入数字1
- 然后输出数组的
shape
属性是输入数组的shape
属性的各轴上的最大值 - 如果输入数组的某个轴的长度为 1,或者与输出数组的各对应轴的长度相同,该数组能正确广播。否则计算出错
- 当输入数组的某个轴的长度为 1时,沿着此轴运算时都用此轴上的第一组值。
- 首先让所有输入数组都向其中维度最高的数组看齐。看齐方式为:在
可以通过
numpy.broadcast_arrays()
查看广播之后的数组你可以通过
ndarray.repeat()
方法来手动重复某个轴上的值.其用法为ndarray.repeat(repeats, axis=None)
,其中:repeats
为重复次数axis
指定被重复的轴,即沿着哪一轴重复。如果未指定,则将数组展平然后重复。返回的也是一个展平的数组
被重复的是该轴的每一组值。
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)
。
- 开始值:结束值:步长。它指定返回数组的开始值和结束值(不包括)。默认的开始值为 0;默认的步长为 1。与
numpy
还提供了mgrid
对象,它类似于ogrid
对象。但是它返回的是广播之后的数组,而不是广播之前的数组:
numpy
提供了meshgrid()
函数,其用法为:numpy.meshgrid(x1,x2,...xn)
。其中xi
是都是一维数组。返回一个元组(X1,X2,...Xn)
,是广播之后的数组。假设xi
的长度为li
,则返回元组的每个数组的形状都是(l1,l2,...ln)
。numpy.ix_()
函数可以将N
个一维数组转换成可广播的N
维数组。其用法为numpy.ix_(x1,x2,x3)
,返回一个元组。元组元素分别为对应的可广播的N
维数组。返回的是广播前的数组,而不是广播后的数组
每个转换前的一维数组,对应了一个转换后的
N
维数组