可视化有很好的答案,但是纯粹从分析的角度思考可能会有所帮助。
您可以使用 numpy 创建任意维度的数组。例如,这是一个 5 维数组:
>>> a = np.random.rand(2, 3, 4, 5, 6)
>>> a.shape
(2, 3, 4, 5, 6)
您可以通过指定索引来访问此数组的任何元素。例如,这里是这个数组的第一个元素:
>>> a[0, 0, 0, 0, 0]
0.0038908603263844155
现在,如果您取出其中一个维度,您将获得该维度中的元素数量:
>>> a[0, 0, :, 0, 0]
array([0.00389086, 0.27394775, 0.26565889, 0.62125279])
当您应用sum
带有axis
参数的函数时,该维度会被消除,并且会创建维度小于原始维度的数组。对于新数组中的每个单元格,运算符将获取元素列表并应用归约函数来获取缩放器。
>>> np.sum(a, axis=2).shape
(2, 3, 5, 6)
现在您可以检查该数组的第一个元素是否是上述元素的总和:
>>> np.sum(a, axis=2)[0, 0, 0, 0]
1.1647502999560164
>>> a[0, 0, :, 0, 0].sum()
1.1647502999560164
具有特殊含义,axis=None
可以展平数组并将函数应用于所有数字。
现在您可以考虑更复杂的情况,其中axis不仅仅是数字而是元组:
>>> np.sum(a, axis=(2,3)).shape
(2, 3, 6)
请注意,我们使用相同的技术来确定这种减少是如何完成的:
>>> np.sum(a, axis=(2,3))[0,0,0]
7.889432081931909
>>> a[0, 0, :, :, 0].sum()
7.88943208193191
您也可以使用相同的推理在数组中添加维度而不是减少维度:
>>> x = np.random.rand(3, 4)
>>> y = np.random.rand(3, 4)
# New dimension is created on specified axis
>>> np.stack([x, y], axis=2).shape
(3, 4, 2)
>>> np.stack([x, y], axis=0).shape
(2, 3, 4)
# To retrieve item i in stack set i in that axis
希望这能让您对这个重要参数有通用和全面的理解。