如何将 numpy apply_over_axes 与 lambda 函数一起使用?
这个:
import pandas as pd
import numpy as np
a = np.arange(6).reshape(2,3)
print(a)
>>[[0 1 2]
>> [3 4 5]]
def method_name(x,axis=0):
return lambda x: print(x) or x ** 2
np.apply_over_axes(method_name, a,0)
结果:
AttributeError: 'function' object has no attribute 'ndim'
在 method_name
声明中省略任何参数会导致:
TypeError: method_name() takes 0 positional arguments but 2 were given
最佳答案
我对其他 apply
函数提供了更多帮助,因此必须查看文档和实验。
但是看看当我们调用您的函数时会发生什么:
In [185]: method_name(a,0)
Out[185]: <function __main__.method_name.<locals>.<lambda>(x)>
它返回 lambda 函数。 apply
期望函数调用返回一个数组,因此提示它没有 ndim
。
更改功能:
def method_name(x,axis=0):
l = lambda x: print(x) or x ** 2
return l(x)
现在可以了:
In [187]: np.apply_over_axes(method_name, a,0)
[[0 1 2]
[3 4 5]]
Out[187]:
array([[ 0, 1, 4],
[ 9, 16, 25]])
因此它调用了method_name
一次,并传递了a
。您的 lambda 打印 a
(作为副作用)并返回其平方。
如果我们提供 2 个轴值会怎样?
In [188]: np.apply_over_axes(method_name, a,[0,1])
[[0 1 2]
[3 4 5]]
[[ 0 1 4]
[ 9 16 25]]
Out[188]:
array([[ 0, 1, 16],
[ 81, 256, 625]])
它的平方是两倍!对于第二次调用,它将第一次调用的结果作为 x
传递。轴不必是唯一的或按顺序排列:np.apply_over_axes(method_name, a,[0,1,0,1])
文档使用 np.sum
作为函数来说明它,并使用多个轴演示与 sum
的等效性。最初像 sum
这样的函数只采用一个轴值。在这种情况下,这个apply_over_axes将是重复求和的便捷方法(而不是np.sum(np.sum(a, 0),0))。但现在类似的函数需要一个列表,因此不再需要这个 apply_over_axes
函数。
cumsum
可能比 sum
更好,因为它返回维度数组,并且不采用多个轴:
垂直求和:
In [210]: np.cumsum(a,0)
Out[210]:
array([[0, 1, 2],
[3, 5, 7]])
再次跨列:
In [211]: np.cumsum(_,1)
Out[211]:
array([[ 0, 1, 3],
[ 3, 8, 15]])
使用apply
做同样的事情:
In [212]: np.apply_over_axes(np.cumsum, a, [0])
Out[212]:
array([[0, 1, 2],
[3, 5, 7]])
In [213]: np.apply_over_axes(np.cumsum, a, [0,1])
Out[213]:
array([[ 0, 1, 3],
[ 3, 8, 15]])
<小时/>
或其他:
In [229]: l = lambda a, axis: np.add.accumulate(a**2, axis)
In [230]: l(l(a,0),1)
Out[230]:
array([[ 0, 1, 17],
[ 81, 370, 1211]])
In [231]: np.apply_over_axes(l, a, [0,1])
Out[231]:
array([[ 0, 1, 17],
[ 81, 370, 1211]])
对于函数减少维度的情况可能更有用,例如 reduce
:
In [236]: rl = lambda a, axis: np.add.reduce(a**2, axis)
In [237]: np.apply_over_axes(rl, a, [0,1])
Out[237]: array([[1211]])
apply_over_axes
在跟踪维度方面比嵌套调用做得更好:
In [239]: rl(rl(a,0),0)
Out[239]: 1211
In [240]: rl(rl(a,0)[None,:],1)
Out[240]: array([1211])
关于python - 如何将 numpy apply_over_axes 与 lambda 函数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51809440/