给我的lambda表达式列表(Sympy's lambdify),一些明确取决于变量x
,一些常量。我想用Numpy数组来评估那些。
在使用Numpy数组lambda x: 1.0 + x**2
计算lambda表达式(例如x
)时,结果将与数组具有相同的形状。如果表达式恰好未明确包含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
有没有办法让输出参数的形状保持一致?
答案 0 :(得分:3)
您可以使用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
。
答案 1 :(得分:0)
你似乎想要一组数组:
>>> 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.])
答案 2 :(得分:0)
我没有看到问题,只是这样做:
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 :(得分:0)
使用ones_like
:
g = lambda x: np.ones_like(x) * 1.0
还有一个稍微粗俗的解决方案:
g = lambda x: 1.0 + (x*0)