【问题标题】:Constant lambda expressions, shape of return data常量 lambda 表达式,返回数据的形状
【发布时间】:2014-06-16 22:14:26
【问题描述】:

给我的 lambda 表达式列表(Sympy's lambdify),有些显式依赖于变量 x,有些是常量。我想用 Numpy 数组来评估那些一致的。

当使用 Numpy 数组 x 评估 lambda 表达式时,例如 lambda x: 1.0 + x**2,结果将具有与数组相同的形状。如果表达式碰巧没有明确包含x,例如g = lambda x: 1.0,则只返回一个标量。

import numpy

f = [lambda x: 1.0 + x**2, lambda x: 1.0]

X = numpy.array([1, 2, 3])

print(f[0](X))
print(f[1](X))

返回

[  2.   5.  10.]
1.0

有没有办法让输出参数的形状保持一致?

【问题讨论】:

  • 我知道有更好的方法,但只是为了 lolz:g = lambda x: 1.0 * x/x
  • @user667648:虽然如果x 包含零,那会做坏事。 1.0 + x*0 更安全。
  • @nneonneo:是的……这对 lolz 来说是件好事。

标签: python arrays lambda


【解决方案1】:

你可以使用ones_like:

>>> X = numpy.array([1, 2, 3])
>>> def g(x): return numpy.ones_like(x)
>>> g(X)
array([1, 1, 1])

请注意,这将返回整数,而不是浮点数,因为那是输入 dtype;你可以指定dtype=float 或乘以1.0,如果你喜欢总是得到浮点数。

PS:使用lambda 然后立即给它起一个名字有点奇怪。就像戴了口罩发名片一样。

PPS:早在ones_like 之前,当我想要适当形状的东西时,我倾向于使用x*0+1

【讨论】:

  • 我不能使用 ones_like,因为我对 lambda 表达式的创建没有影响,但是添加 0*x 的包装器可以解决问题。
【解决方案2】:

我没有看到问题,只是这样做:

import numpy as np

X = np.array([1, 2, 3])

f = lambda x: 1.0 + x**2
print(f(X))

g = lambda x: np.ones(shape=(len(X),))
print(g(X))

哪些打印:

[  2.   5.  10.]
[ 1.  1.  1.]

注意使用np.ones(shape=(len(X),))与使用np.ones_like(X)是一样的

【讨论】:

    【解决方案3】:

    使用ones_like:

    g = lambda x: np.ones_like(x) * 1.0
    

    还有这个稍微 hackier 的解决方案:

    g = lambda x: 1.0 + (x*0)
    

    【讨论】:

      【解决方案4】:

      你似乎想要一个数组:

      >>> import numpy
      >>> numpy.ones(3)
      array([ 1.,  1.,  1.])
      

      如果你想设置标量,这样做很容易

      g = lambda x: numpy.ones(shape=x.shape) * 2
      
      g(X)
      

      返回

      array([ 2.,  2.,  2.])
      

      所以对于任意数组:

      g = lambda x: numpy.ones(shape=x.shape) * 1
      
      n = numpy.array([1,2,3,4,5])
      

      g(n) 是

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

      【讨论】:

        猜你喜欢
        • 2011-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多