Numpy,沿数组维度应用函数列表

Posted

技术标签:

【中文标题】Numpy,沿数组维度应用函数列表【英文标题】:Numpy, apply a list of functions along array dimension 【发布时间】:2017-11-20 16:58:23 【问题描述】:

我有一个类型的函数列表:

func_list = [lambda x: function1(input),
             lambda x: function2(input),
             lambda x: function3(input),
             lambda x: x]

和一个形状为 [4, 200, 200, 1] 的数组(一批图像)。

我想沿第 0 轴按顺序应用函数列表。

编辑:重新表述问题。这相当于上面的。说,而不是数组,我有一个由 4 个相同数组组成的元组,形状为 (200, 200, 1),我想在第一个元素上应用 function1,在第二个元素上应用 function2,等等。这可以做到吗?一个for循环?

【问题讨论】:

只是为了理解,您想将其应用于特定行吗?轴?还是在整个矩阵上?这些函数是否会转换每个元素,或者它们是否类似于 sum/max 函数,提供单个输出? 【参考方案1】:

您可以使用np.apply_along_axis 迭代您的函数列表:

import numpy as np
x = np.ranom.randn(100, 100)
for f in fun_list:
    x = np.apply_along_axis(f, 0, x)

基于 OP 的更新

假设你的函数和批次大小相同:

batch = ... # tuple of 4 images  
batch_out = tuple([np.apply_along_axis(f, 0, x) for f, x in zip(fun_list, batch)])

【讨论】:

是否可以避免for循环? @Quubix 如果有办法,这将是一个很好的功能。但我不确定是否有。【参考方案2】:

我尝试了@Coldspeed 的答案,它确实有效(所以我会接受它)但这是我找到的替代方案,不使用 for 循环:

result = tuple(map(lambda x,y:x(y), functions, image_tuple))

编辑:忘记添加元组(),谢谢@Coldspeed

【讨论】:

如果使用 python 3,请不要忘记添加 tuple() 到最终答案。 [x(y) for x, y in zip(functions, image_tuple)] 是理解等价物。

以上是关于Numpy,沿数组维度应用函数列表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 numpy 或 pandas 创建(或更改)数组/列表的维度?

交错形状不匹配的 NumPy 数组

沿numpy数组中的范围应用函数

使用列表中的随机元素创建 numpy 数组

numpy 常用函数

Numpy详解