Python numpy:沿除最后一个轴以外的所有轴求和

Python numpy:沿除最后一个轴以外的所有轴求和,python,numpy,Python,Numpy,如果我有一个任意形状的ndarray,我想计算除了最后一个轴以外的所有轴的和,例如,我可以通过 all_but_last = tuple(range(arr.ndim - 1)) sum = arr.sum(axis=all_but_last) 现在,tuple(range(arr.ndim-1))并不是很直观。有没有一种更优雅的方式 此外,如果我想对不同形状的多个数组执行此操作,我必须为每个数组计算一个单独的维度元组。有没有更规范的方式来表达“不管尺寸是什么,只给我一个轴以外的所有轴”你可以

如果我有一个任意形状的
ndarray
,我想计算除了最后一个轴以外的所有轴的和,例如,我可以通过

all_but_last = tuple(range(arr.ndim - 1))
sum = arr.sum(axis=all_but_last)
现在,
tuple(range(arr.ndim-1))
并不是很直观。有没有一种更优雅的方式


此外,如果我想对不同形状的多个数组执行此操作,我必须为每个数组计算一个单独的维度元组。有没有更规范的方式来表达“不管尺寸是什么,只给我一个轴以外的所有轴”

你可以使用
np。在多个轴上应用_

np.apply_over_axes(np.sum, arr, [0,2]) #sum over axes 0 and 2

np.apply_over_axes(np.sum, arr, range(arr.ndim - 1)) #sum over all but last axis

您可以重塑阵列,使除最后一个轴外的所有轴都变平(例如,形状
(k,l,m,n)
变为
(k*l*m,n)
),然后在第一个轴上求和

例如,以下是您的计算:

In [170]: arr.shape
Out[170]: (2, 3, 4)

In [171]: arr.sum(axis=tuple(range(arr.ndim - 1)))
Out[171]: array([2.85994792, 2.8922732 , 2.29051163, 2.77275709])
以下是备选方案:

In [172]: arr.reshape(-1, arr.shape[-1]).sum(axis=0)
Out[172]: array([2.85994792, 2.8922732 , 2.29051163, 2.77275709])

无论直观与否,我认为这都充分利用了
参数。将其隐藏在函数中,没有人会知道其区别(您可以对其进行注释)
numpy
函数经常玩这种“游戏”。这不是在做同样的事情吗?但以一种更慢的方式,在Python代码中迭代轴,而不是在内部进行
sum
?@hpaulj我不确定在Python代码中迭代所有轴是什么意思,因为这里显示的所有方法都使用
range
进行轴外推,但请查看
在轴上应用的代码
-它在
轴上迭代
参数时间也一样。即使把速度放在一边,这比求和(轴=…)有什么好处?