numpy:取log(矩阵)时有效避免0

标签 numpy

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/

相关文章:

python - xtensor 和 xsimd : improve performance on reduction

python - Scipy.optimization 线性函数逼近

python - 临时 Numpy 数组的数据库或表解决方案

python - Numpy - 多个 3d 数组与 2d 数组

python - 为什么我的 SGD 与我的线性回归模型相去甚远?

python - 有效地按降序对numpy数组进行排序?

Python - 加快将分类变量转换为其数字索引

python - np.isnan 用于 Python 中的数组

python - 在 "empty"行处切片 numpy 重新排列

Python 等效于用 mu 参数化的 R 的 rnbinom