from numpy import *
m = array([[1,0],
[2,3]])
我想按元素计算log2(m)
,但仅限于m
不为0的地方。在这些地方,我想结果为 0。
我现在正在对抗:
RuntimeWarning: divide by zero encountered in log2
<小时/>
尝试 1:使用 where
res = where(m != 0, log2(m), 0)
它计算出正确的结果,但我仍然记录了一个RuntimeWarning:在log2中遇到除零
。看起来(从语法上来说这是非常明显的)numpy 仍然在整个矩阵上计算 log2(m)
,然后才在 where
中选择要保留的值。
我想避免这个警告。
<小时/>尝试 2:使用 mask
from numpy import ma
res = ma.filled(log2(ma.masked_equal(m, 0)), 0)
当然,屏蔽零会阻止 log2
应用于它们,不是吗?不幸的是,没有:我们仍然收到 RuntimeWarning:divide byzero returned in log2
。
即使矩阵被屏蔽,log2
似乎仍然适用于每个元素。
如何有效计算 numpy 数组的逐元素对数而不收到被零除警告?
- 当然,我可以使用
seterr
暂时禁用这些警告的日志记录,但这看起来不是一个干净的解决方案。 - 当然,双 for 循环有助于特殊处理 0,但会降低 numpy 的效率。
有什么想法吗?
最佳答案
另一个选项是使用where
parameter of numpy's ufuncs :
m = np.array([[1., 0], [2, 3]])
res = np.log2(m, out=np.zeros_like(m), where=(m!=0))
不会引发RuntimeWarning
,并且在不计算日志的地方引入零。
关于numpy:取log(矩阵)时有效避免0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21752989/