python - 这个带有 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)
解决方案
作为“ufunc”,numpy.log
接受参数where
和out
. 因此,一种有效的计算方法如下。
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])