在所有轴上求和,除了其中一个轴

3

多次我处理过类似以下的ND数组:

foo = np.arange(27).reshape((3,3, 3))

然后我将拥有一个维度,我希望在下一步操作中保留该变量。假设下一步操作是mean,那么...

preserveAxis = 1
desiredOutcome = foo.mean(axis=0).mean(axis=1)

以下是我的期望结果,首先在第零个轴上取平均值,然后在初始操作后,对第二个轴(已成为第一个轴)取平均值。也就是说,我在0和2轴上进行了操作,但保留了1轴。

这种类型的过程很繁琐,最重要的是不够通用。我正在寻找一种通用的方法来保留一个轴,但对所有其他轴求和/平均值。最好能在numpy内完成。


你可以详细说明“保留变量以供下一次操作使用”吗? - RomanPerekhrest
@RomanPerekhrest 现在清楚了吗?我不确定我是否在使用普遍接受的语言,所以请随意建议更改。 - FooBar
2个回答

5
这里介绍的是用于n维情况的通用降维方法,具体可以参考ufuncs.
def reduce_skipfew(ufunc, foo, preserveAxis=None):
    r = np.arange(foo.ndim)   
    if preserveAxis is not None:
        preserveAxis = tuple(np.delete(r, preserveAxis))
    return ufunc(foo, axis=preserveAxis)

示例运行 -

In [171]: reduce_skipfew(np.mean, foo, preserveAxis=1)
Out[171]: array([10., 13., 16.])

In [172]: foo = np.arange(27).reshape((3,3, 3))

In [173]: reduce_skipfew(np.mean, foo, preserveAxis=1)
Out[173]: array([10., 13., 16.])

In [174]: reduce_skipfew(np.sum, foo, preserveAxis=1)
Out[174]: array([ 90, 117, 144])

# preserve none i.e. sum all
In [175]: reduce_skipfew(np.sum, foo, preserveAxis=None)
Out[175]: 351

# preserve more than one axis
In [176]: reduce_skipfew(np.sum, foo, preserveAxis=(0,2)) 
Out[176]: 
array([[ 9, 12, 15],
       [36, 39, 42],
       [63, 66, 69]])

好的通用解决方案! - ractiv

4

您可以使用元组作为轴参数:

foo.mean(axis=(0, 2))

如果您的数组具有可变数量的维度和/或保留的维度可以变化,那么情况可能会更加棘手。请参考@Divakar的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接