有没有一种方法可以获取列表中的每个元素而不使用循环?

时间:2019-11-05 18:20:23

标签: python python-3.x numpy numpy-ndarray

我在教授的书中找到了这个任务:

def f(x):
    return f = log(exp(z))

def problem(M: List)
    return np.array([f(x) for x in M])

如何实施解决方案?

1 个答案:

答案 0 :(得分:2)

Numpy只是关于在整个阵列上执行操作。您的教授希望您使用该功能。

首先将列表M转换为数组z

z = np.array(M)

现在您可以执行exp之类的元素操作并记录:

e = np.exp(z)
f = 1 + e
g = np.log(f)

函数np.expnp.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)