【问题标题】:Simple plotting of log function in pythonpython中对数函数的简单绘图
【发布时间】:2019-06-24 03:09:00
【问题描述】:

我在python中写了一个简单的函数来绘制日志:

import matplotlib.pyplot as plt
import numpy as np

x = list(range(1, 10000, 1))
y = [-np.log(p/10000) for p in x]

plt.scatter(x, y) # also tried with plt.plot(x, y)

plt.show()

我只是想看看剧情怎么样。

fn.py:5: RuntimeWarning: divide by zero encountered in log
  y = [-np.log(p/10000) for p in x]

我得到了上述错误,除此之外,我得到一个空白图,甚至范围错误。

奇怪的是,当我除以一个数字时,为什么会有divide by zero 警告?

如何正确绘制函数?

【问题讨论】:

标签: python python-2.7 matplotlib


【解决方案1】:

虽然您已经标记了python-3.x,但您似乎正在使用python-2.x,其中p/10000 将导致p < 10000 的值为0,因为除法运算符/python-2.x 中执行整数除法。 如果是这种情况,您可以显式使用 10000.0 而不是 10000 来避免这种情况并获得浮点除法。

python 3+ 中不需要使用.0,因为默认情况下它执行浮点除法。因此,您的代码在python 3.6.5 中运行良好

import matplotlib.pyplot as plt
import numpy as np

x = list(range(1, 10000, 1))
y = [-np.log(p/10000.0) for p in x]

plt.scatter(x, y)
plt.show()

另一方面:您可以简单地使用 NumPy 的 arange 生成 x 并完全避免 list 并使用矢量化操作。

x = np.arange(1, 10000)
y = -np.log(x/10000.0)

【讨论】:

  • 哇,好球。我不会那样做的。对于任何想知道的人来说,这是因为在 python 2 中,除法整数会输出一个整数,而除法浮点数和整数会返回一个浮点数
  • @WayToDoor:是的,确实
  • @Bazingaa python --version Python 2.7.10。再次被python版本捕获,非常感谢!我试图避免使用python 2.7,但不知何故,在许多地方人们仍在使用它,并且有很多旧代码存在,我必须创建 python 2 环境并且......它继续。
  • @Rafael:为了读者,让我在你的问题中标记 python 2
【解决方案2】:

为什么要导入 numpy 然后避免使用它?你可以简单地完成:

from math import log
import matplotlib.pyplot as plt

x = xrange(1, 10000)
y = [-log(p / 10000.0) for p in x]

plt.scatter(x, y)
plt.show()

如果您打算将 numpy 引入图片,请考虑以类似 numpy 的方式做事:

import matplotlib.pyplot as plt
import numpy as np

f = lambda p: -np.log(p / 10000.0)
x = np.arange(1, 10000)

plt.scatter(x, f(x))
plt.show()

【讨论】:

    猜你喜欢
    • 2016-12-11
    • 2013-08-27
    • 1970-01-01
    • 2017-03-23
    • 2017-04-19
    • 1970-01-01
    • 2021-11-28
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多