gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:28:17 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com