【问题标题】:Apply multiple functions to each row of a numpy array将多个函数应用于 numpy 数组的每一行
【发布时间】:2019-03-26 21:17:56
【问题描述】:

假设我们有一个 3 行 2 列的矩阵作为mat,我想在每 3 行上应用列表what_functions_to_apply_list 的一个函数,我有它们的定义。所以np.apply_along_axis 的输出应该是函数输出维度的 3 行乘以。

如果不以矢量化方式循环,我该如何做到这一点?

例如

def f1(inp1,inp2):
     return out1, out2

在哪里

 functions_dic = {'f1': func1, 'f2':func2, 'f3':func3}
 what_functions_to_apply_list = ['f1','f1','f2']
 funcs_inputs = [[inp11,inp12], [inp21,inp32], [inp31,inp32]]
 mat = np.ones((3, 2))
 np.apply_along_axis(what_functions_to_apply_list , 1, mat)

【问题讨论】:

  • 你不能。应用这样的自定义函数必然需要调用 Python,它将以for-loop speed 运行
  • apply_along_axis 不适合这种用途。首先,第一个参数是一个函数,而不是函数列表。即使使用正确的函数,它也不是显式迭代的更快替代方案。它不是一个“无循环矢量化”工具。
  • 请添加示例数据。

标签: python function numpy vectorization


【解决方案1】:

将函数列表直接应用于数组的行:

In [418]: alist = [np.add, np.subtract, np.multiply]                            
In [419]: data = np.arange(6).reshape(3,2)                                      
In [420]: [foo(*ab) for foo, ab in zip(alist, data)]                            
Out[420]: [1, -1, 20]

【讨论】:

  • 如何为每个函数提供输入
  • 这是提供输入,data 的行。如果您指的是其他参数(例如轴),则必须创建首先设置这些参数的函数(或 lambdas)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 2011-11-02
  • 2016-08-19
相关资源
最近更新 更多