【问题标题】:Pass argument to array of functions将参数传递给函数数组
【发布时间】:2018-04-13 11:25:09
【问题描述】:

我有一个 2D numpy lambda 函数数组。每个函数都有 2 个参数并返回一个浮点数。

将相同的 2 个参数传递给所有这些函数并得到一个 numpy 数组答案的最佳方法是什么?

我尝试过类似的方法:

np.reshape(np.fromiter((fn(1,2) for fn in np.nditer(J,order='K',flags=["refs_ok"])),dtype = float),J.shape)

使用参数(1,2) 评估J 中的每个函数(J 包含函数)。

但它看起来很绕房子,而且不太好用...... 有什么好办法吗?

A = J(1,2)

没用!

【问题讨论】:

  • 为什么这是一个数组?为什么不是列表(或列表列表)?无论如何,它必须是一个对象 dtype 数组,所以你不能对它做太多的数学运算。而且列表的迭代速度更快。

标签: python-3.x numpy lambda


【解决方案1】:

您可以使用列表推导:

A = np.asarray([[f(1,2) for f in row] for row in J])

这应该适用于 numpy 数组和列表列表。

【讨论】:

    【解决方案2】:

    我认为没有真正干净的方法,但这是相当干净且有效的:

    import operator
    import numpy as np
    
    # create array of lambdas
    a = np.array([[lambda x, y, i=i, j=j: x**i + y**j for i in range(4)] for j in range(4)])
    
    # apply arguments 2 and 3 to all of them
    np.vectorize(operator.methodcaller('__call__', 2, 3))(a)
    # array([[ 2,  3,  5,  9],
    #        [ 4,  5,  7, 11],
    #        [10, 11, 13, 17],
    #        [28, 29, 31, 35]])
    

    另外,稍微灵活一点:

    from types import FunctionType
    
    np.vectorize(FunctionType.__call__)(a, 2, 3)
    # array([[ 2,  3,  5,  9],
    #        [ 4,  5,  7, 11],
    #        [10, 11, 13, 17],
    #        [28, 29, 31, 35]])
    

    【讨论】:

    • 这里vectorize 使2d a 的迭代更容易,但没有提高速度(与显式循环相比)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2013-01-27
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多