【问题标题】:numpy: summing along all but last axisnumpy:沿除最后一个轴之外的所有轴求和
【发布时间】:2018-08-06 15:35:54
【问题描述】:

如果我有一个任意形状的ndarray,并且我想计算除最后一个轴之外的所有轴的总和,例如,我可以通过这样做来实现它

all_but_last = tuple(range(arr.ndim - 1))
sum = arr.sum(axis=all_but_last)

现在,tuple(range(arr.ndim - 1)) 我感觉并不完全直观。有没有更优雅/numpy-esque 的方式来做到这一点?

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

【问题讨论】:

  • 直观与否,我认为这充分利用了axis 参数。把它隐藏在一个函数中,没有人会知道其中的区别(你可以评论它)。 numpy 函数经常玩这种“游戏”。

标签: python numpy


【解决方案1】:

您可以重新调整数组的形状,使除最后一个轴之外的所有轴都变平(例如,形状 (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])

【讨论】:

    【解决方案2】:

    您可以使用np.apply_over_axes 对多个轴求和。

    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
    

    【讨论】:

    • 这不就是在做同样的事情吗?但以较慢的方式,在 Python 代码中迭代轴,而不是在内部迭代到 sum?
    • @hpaulj 我不确定你在 python 代码中迭代所有轴的意思,因为这里显示的所有方法都使用range 进行轴外推
    • 但是看看apply_over_axes 的代码——它在axes 参数上迭代。 Timeit 也是如此。
    • 即使不考虑速度,这比sum(axis=...) 有什么好处?
    猜你喜欢
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 2021-06-04
    • 2019-04-12
    • 1970-01-01
    相关资源
    最近更新 更多