【问题标题】:Numpy, apply a list of functions along array dimensionNumpy,沿数组维度应用函数列表
【发布时间】: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 函数,提供单个输出?

标签: python arrays function numpy


【解决方案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)] 是理解等价物。
猜你喜欢
  • 2017-08-18
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 2013-11-07
  • 2011-03-04
  • 1970-01-01
相关资源
最近更新 更多