Python 这个带有NumPy计算的代码能更有效吗?

Python 这个带有NumPy计算的代码能更有效吗?,python,arrays,numpy,Python,Arrays,Numpy,我想将数组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]) 使用a上的np.where将非正数屏蔽为1,然后使用np.log: 输出: 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])
使用a上的np.where将非正数屏蔽为1,然后使用np.log:

输出:

array([0.        , 0.        , 0.        , 0.69314718])
作为一个ufunc,numpy.log接受where和out参数。因此,一个有效的计算方法如下

In [6]: a = np.array([-1, 0, 1, 2])
创建输出数组

In [7]: b = np.zeros(len(a))
告诉numpy.log只计算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])

使用np.where和口罩:np.where完美答案。非常感谢。
In [7]: b = np.zeros(len(a))
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])