仅对数组的正项应用对数
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]
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]