目录
1.作为被广播的数组如果不满足维度要求,那么广播机制会在数组的shape元组的首位加一以调整维度
2.能用与广播操作的数组应满足每个维度上的元素数量与最大数量相等或者刚好为1
3.输出的数组结果形状由参与运算的数组在各个维度上最大值确定
1.广播机制
Numpy法广播机制对数组操作来说是相当方便的操作机制之一。广播机制使得特定条件下的不同数组进行加减乘除操作,省去了因数组维度不同或者大小不同时扩展的相对麻烦的操作
广播机制运行规则:
1.作为被广播的数组如果不满足维度要求,那么广播机制会在数组的shape元组的首位加一以调整维度
例如:对一维数组a和二维数组b进行加和操作
- 广播前
>>>a = np.array([1, 2, 3])
>>>b = np.array([[1, 2, 3], [4, 5, 6]])
>>>a
array([1, 2, 3])
>>>a.shape
(3,)
>>>b
array([[1, 2, 3]
[4, 5, 6]])
>>>b.shape
(2,3)
- 广播后(这一步不会体现在可视化界面上,只是用于理解)
第一步操作
>>>a
array([[1, 2, 3]])
>>>a.shape
(1,3)
第二步操作
>>>a
array([[1, 2, 3]
[1, 2, 3]])
>>>a.shape(== b.shape)
(2,3)
- 结果
>>>a+b
array([[2,4,6],
[5,7,9]])
2.能用与广播操作的数组应满足每个维度上的元素数量与最大数量相等或者刚好为1
例如:有一个形状为(4, 3, 8, 6)的数组A,那么对于不满足这个形状的数组B要与A进行加减操作时应该满足,B的形状应该是:
(1, 3, 8, 6) | (4, 1, 8, 6) |
(4, 3, 1 6) | (4, 3, 8, 1) |
(1, 1, 8, 6) | (1, 3, 1, 6) |
(1, 3, 8, 1) | (4, 1, 1, 6) |
(4, 1, 8, 1) | (4, 3, 1, 1) |
(1, 1, 1, 6) | (1, 1, 8, 1) |
(1, 3, 1, 1) | (1, 1, 1, 1) |
如果对于一个C数组,其维度数小于4,根据一规则,C应该如何满足广播机制来与A进行操作?
- 对C来说,其维度数小于4,那么对应规则一,在其shape首位加入1,若还是小于,那么继续加入1最终以满足维度数达到4;由于C只能确定低维度下的数组状态,那么显而易见,其形状应该优先满足A的低维度形状
3.输出的数组结果形状由参与运算的数组在各个维度上最大值确定
例如对于形状为(2, 1, 3)与形状为(1, 1, 6)的数组进行操作,那么输出应为形状为(2, 1, 6)
4.对于维度上数值为1的轴,扩展时进行重复性填充
具体可以参考第一条a由一维数组转化为二维数组的操作
2.切片操作
- Numpy对array的切片操作类似于Python的列表切片操作
- 不同的是,由于Numpy具有多个维度,那么切片多样性也较Python列表多样性更丰富
例如:
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
a[1] = [4, 5, 6] # 对于单个值来说,ndarray操作的是最高维的轴,也就是shape的第一个值
a[1:] = [[4, 5, 6],
[7, 8, 9]]
a[1, 1] = 5 # 二维数组的不同维度用逗号进行分隔
a[1:, 1:] = [[5, 6],
[8, 9]]
3.坐标轴与维度
理解ndarray的坐标轴和维度对ndarray的操作将会大大加深~
对于维度属性,ndarray的属性ndim展示了数组的维度数,而ndarray的属性shape则展示了每个维度上的元素个数;
对于shape属性,ndarray用axis(轴)来完成对每个维度上期望的操作:
- axis的大小不能超过数组的ndim大小,即axis < ndim
- axis本质上是对shape元组的操作,理解shape添加维度的机制有助于axis的操作理解正如前面所说到的那样,shape的维度添加都是添加到最前面的,
那么
- axis=0一定是对最高维的操作,例如对(3, 2, 5)的数组来说axis=0操作的是3这个维度数上的数据;
- axis=1是对shape第二个数据进行操作,对应上面的数字2;
- axis=2是对shape最低维的数据进行操作.
- axis对要操作的维度进行操作时,其他维度是“不动”的
仍然以上面为例,axis=0对3所在维度进行操作时,其操作状态应该是:
(?, constant,constant)
>>>a = np.random.randint(0, 10, size=(3, 2, 5)) [[[3 0 7 2 0] [4 1 7 5 2]] [[9 7 3 0 3] [1 7 8 9 5]] [[8 7 7 9 5] [9 9 5 5 9]]] >>>a.sum(axis=0) [[20 14 17 11 8] [14 17 20 19 16]]