我在教授的书中找到了这个任务:
def f(x):
return f = log(exp(z))
def problem(M: List)
return np.array([f(x) for x in M])
如何实施解决方案?
答案 0 :(得分:2)
Numpy只是关于在整个阵列上执行操作。您的教授希望您使用该功能。
首先将列表M
转换为数组z
:
z = np.array(M)
现在您可以执行exp
之类的元素操作并记录:
e = np.exp(z)
f = 1 + e
g = np.log(f)
函数np.exp
和np.log
应用于数组的每个元素。如果输入不是数组,则将其转换为一个。
类似1 + e
的操作也可以在整个数组上工作,在这种情况下,使用broadcasting的魔力。由于1
是标量,因此可以明确地将其扩展为与e
相同的形状,并且可以像np.add
一样添加。
通常,操作序列可以压缩为一行,类似于您最初的尝试。您可以使用np.log1p
来稍微减少操作次数:
def f(x):
return np.log1p(np.exp(x))
请注意,我没有先将x
转换为数组,因为np.exp
会为您做到这一点。
这种幼稚方法的基本问题是np.exp
会溢出我们期望会获得合理结果的值。这可以使用this答案中的技术来解决:
def f(x):
return np.log1p(np.exp(-np.abs(x))) + np.maximum(x, 0)