python - 如何将 numpy apply_over_axes 与 lambda 函数一起使用?

标签 python numpy

如何将 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/

相关文章:

python - 重复 Scipy 的 griddata

python - 加载 .npy 文件作为 pytorch 的数据集

python - numpy.loadtxt unix 时间戳转换器

python - 使用 cython 将模块移植到 python 3.1

python - 如何以人类可读的方式将 python 字典序列化为文本?

python - 左对齐 Pandas 滚动对象

numpy - 是否可以在Spark Dataframe列中存储一个numpy数组?

python - 从 Python 3 中的列表填充 map 的单行方法

python - 如何在 Python 中创建不可变对象(immutable对象)?

python - 在 NumPy ndArray 中基于 bool 值查找最长序列的更有效解决方案