【问题标题】:How to use vectorized NumPy operations on lambda functions that return constant values?如何对返回常量值的 lambda 函数使用矢量化 NumPy 操作?
【发布时间】:2019-02-11 11:12:15
【问题描述】:

为什么这个函数返回浮点数?

func = lambda x: 1.
x = np.linspace(0,1,10)
func(x).shape

结果是

AttributeError: 'float' object has no attribute 'shape'

我期望以下行为:

func = lambda x: 1. + 0*x
x = np.linspace(0,1,10)
func(x)

array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

如何在不弄乱 lambda 函数的情况下获得预期的结果(即无需编写 func = lambda x: 1. + 0*x)?

背后的想法是用户将此函数传递给另一个函数以在网格上进行进一步评估。我不能指望用户将常量函数设为1 + 0*x。我应该怎么办?

【问题讨论】:

  • 这个 lambda 函数总是返回1.,它是一个float,并且一个浮点数没有形状...请注意,该函数正在接收x,但没有对它做任何事情.另外你的预期输出是什么?
  • Numpy.linspace返回一个数组(一个ndarray),你需要定义一个对这样一个数组进行操作的函数。

标签: python numpy lambda vectorization


【解决方案1】:

查看numpy.vectorize 方法: http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.vectorize.html

func = lambda x: 1.
x = np.linspace(0,1,10)
x_func = np.vectorize(func)
x_func(x)

返回:array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

虽然从您的问题中假设您只想创建一个长度为 1*10 的数组,初始化为 1.

为什么不使用np.full(10, 1.)

https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.full.html

【讨论】:

  • np.vectorize 是我想要的。谢谢你。我不只是创建np.ones。这个函数是一个用户定义的函数,用来评估其他东西。
  • 我刚刚发现np.vectorize(func,signature='()->(n)')func 返回一个常量数组时有效。
【解决方案2】:
  1. 不要将 lambda 用作持久函数。你的

    func = lambda x: 1.
    

    完全一样

    def func(x):
        return 1.
    
  2. 不清楚您要做什么。您的 lambda 正在返回 1.0,不考虑传递的参数。请说明您期望的逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2017-01-07
    相关资源
    最近更新 更多