仅对数组的正项应用对数

Apply logarithm only on positive entries of array

SciPy 贴心地提供了 scipy.log 函数,它将获取一个数组,然后记录该数组中的所有元素。有没有办法只记录数组的正(即正非零)元素?

可能不是您要找的答案,但我会把它放在这里:

for i in range(0,rows):
    for j in range(0,cols):
        if array[i,j] > 0:
            array[i,j]=log(array[i,j])    

您可以矢量化自定义函数。

import numpy as np

def pos_log(x):
    if x > 0:
        return np.log(x)
    return x

v_pos_log = np.vectorize(pos_log, otypes=[np.float])

result = v_pos_log(np.array([-1, 1]))
#>>> np.array([-1, 0])

但是正如 numpy.vectorize 的文档所说 "The vectorize function is provided primarily for convenience, not for performance. The implementation is essentially a for loop."

这是一个向量化的解决方案,它保留原始数组并保留非正值不变:

In [1]: import numpy as np
In [2]: a = np.array([ 1., -1., 0.5, -0.5, 0., 2. ])
In [3]: loga = np.log(a)
In [4]: loga
Out[4]: array([ 0., nan, -0.69314718, nan, -inf, 0.69314718 ])

In [5]: # Remove nasty nanses and infses
In [6]: loga[np.where(~np.isfinite(loga))] = a[np.where(~np.isfinite(loga))]
In [7]: loga
Out[7]: array([ 0., -1., -0.69314718, -0.5,  0., 0.69314718])

这里,np.where(~np.isfinite(loga)) returns loga 数组中非有限条目的索引,我们将这些值替换为 a 中相应的原始值。

使用布尔索引:

In [695]: a = np.array([ 1. , -1. ,  0.5, -0.5,  0. ,  2. ])    
In [696]: I=a>0
In [697]: a[I]=np.log(a[I])
In [698]: a
Out[698]: 
array([ 0.        , -1.        , -0.69314718, -0.5       ,  0.        ,
        0.69314718])

或者如果您只想保留 logged 条款

In [707]: np.log(a[I])
Out[707]: array([ 0.        , -0.69314718,  0.69314718])

where()呢?

import numpy as np
a = np.array([ 1., -1., 0.5, -0.5, 0., 2. ])
la = np.where(a>0, np.log(a), a) 
print(la)
# Gives [ 0.         -1.         -0.69314718 -0.5         0.          0.69314718]