pythonic方式将函数多次应用于对象

时间:2014-11-11 10:02:47

标签: python arrays numpy

我想反复总结一个numpy ndarray的不同维度,例如。

#what I've got
sumOverDims = [6 4 2 1]
ndarray = any n-dimensional numpy array

#what I want to do
ndarray.sum(6).sum(4).sum(2).sum(1)

如果没有丑陋的循环,我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

Numpy的sum接受axis参数的元组:

ndarray.sum(axis=(1,2,4,6))

答案 1 :(得分:1)

一般来说,像是

X.f(e0).f(e1).f(e2).…

可以改写为

reduce(lambda a, b: a.f(b), [ e0, e1, e2, … ], X)

或(如果你不喜欢lambdas):

def f_(a, b):  return a.f(b)
reduce(f_, [ e0, e1, e2, … ], X)

但我有点怀疑这是否真的使它比使用迭代循环更具可读性和更有效的清晰度(因此更加Pythonic):

result = X
for e in [ e0, e1, e2, … ]:
  result = result.f(e)
return result

我想这可以归结为品味和你更习惯的事情。

答案 2 :(得分:0)

您可以使用reduce。仅包含两个维度的示例:

>>> A = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
>>> reduce(numpy.sum, [1], A)
array([ 6, 15, 24])
>>> reduce(numpy.sum, [1, 0], A)
45

reduce的参数是numpy的{​​{1}}函数,一个包含要求总和的列表,sum数组numpy作为要减少的初始要素。该函数将(部分求和的)A数组和下一个求和的维度作为参数。