首页 > 解决方案 > 这个带有 NumPy 计算的代码可以更高效吗?

问题描述

我想转换array a为 log_e。如果要转换的数字为非正数,则将其转换为 0:

import numpy as np
a = np.array([-1,0,1,2])
b = np.zeros(len(a))
for i in range(0,len(a)):
    if a[i] <= 0:
        b[i] = 0
    else:
        b[i] = np.log(a[i])

为了提高计算性能,我认为以下更好。但随后错误RuntimeWarning: divide by zero encountered in log弹出。我可以使用一些代码来进行我的预期计算吗?

import numpy as np
a = np.array([0,0,1,2])
b = np.log(a)

标签: pythonarraysnumpy

解决方案


作为“ufunc”,numpy.log接受参数whereout. 因此,一种有效的计算方法如下。

In [6]: a = np.array([-1, 0, 1, 2])

创建输出数组。

In [7]: b = np.zeros(len(a))

告诉numpy.log只计算结果 where a > 0,并将输出放入b. 这将返回给定的数组,并就地out修改out(即)。b

In [8]: np.log(a, where=a > 0, out=b)
Out[8]: array([0.        , 0.        , 0.        , 0.69314718])

In [9]: b
Out[9]: array([0.        , 0.        , 0.        , 0.69314718])

推荐阅读