numpy.piecewise中的多个部分

发布于 2021-01-29 16:24:17

我正在上模糊系统课程,并在计算机上记笔记。这意味着我不得不不时在计算机上绘制图形。由于这些图的定义非常明确,因此我认为将其绘制numpy为一个好主意(我使用LaTeX做笔记,并且在python
shell上相当快,因此我认为可以摆脱这种情况)。

模糊隶属函数的图形是高度分段的,例如:

模糊隶属度函数

为了对此进行绘图,我尝试使用以下代码进行编码numpy.piecewise(这给了我一个神秘的错误):

In [295]: a = np.arange(0,5,1)

In [296]: condlist = [[b<=a<b+0.25, b+0.25<=a<b+0.75, b+0.75<=a<b+1] for b in range(3)]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-296-a951e2682357> in <module>()
----> 1 condlist = [[b<=a<b+0.25, b+0.25<=a<b+0.75, b+0.75<=a<b+1] for b in range(3)]

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

In [297]: funclist = list(itertools.chain([lambda x:-4*x+1, lambda x: 0, lambda x:4*x+1]*3))

In [298]: np.piecewise(a, condlist, funclist)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-298-41168765ae55> in <module>()
----> 1 np.piecewise(a, condlist, funclist)

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/function_base.pyc in piecewise(x, condlist, funclist, *args, **kw)
    688     if (n != n2):
    689         raise ValueError(
--> 690                 "function list and condition list must be the same")
    691     zerod = False
    692     # This is a hack to work around problems with NumPy's

ValueError: function list and condition list must be the same

在这一点上,我对如何绘制此函数感到很困惑。我不太了解错误消息,这进一步阻碍了我调试该错误的努力。

最终,我希望将这个函数绘制并导出到EPS文件中,因此,我也很感谢这些帮助。

关注者
0
被浏览
146
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    通常,当您仅将代码编写为数字时,numpy数组非常擅长做明智的事情。链接比较是罕见的例外之一。您看到的错误本质上是这样的(piecewise内部和ipython错误格式对此进行了混淆):

    >>> a = np.array([1, 2, 3])
    >>> 1.5 < a
    array([False,  True,  True], dtype=bool)
    >>> 
    >>> 1.5 < a < 2.5
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    >>> 
    >>> (1.5 < a) & (a < 2.5)
    array([False,  True, False], dtype=bool)
    >>>
    

    您也可以使用np.logical_and,但是按位and工作就可以了。

    就绘图而言,numpy本身不执行任何操作。这是matplotlib的示例:

    >>> import numpy as np
    >>> def piecew(x):
    ...   conds = [x < 0, (x > 0) & (x < 1), (x > 1) & (x < 2), x > 2]
    ...   funcs = [lambda x: x+1, lambda x: 1, 
    ...            lambda x: -x + 2., lambda x: (x-2)**2]
    ...   return np.piecewise(x, conds, funcs)
    >>>
    >>> import matplotlib.pyplot as plt
    >>> xx = np.linspace(-0.5, 3.1, 100)
    >>> plt.plot(xx, piecew(xx))
    >>> plt.show() # or plt.savefig('foo.eps')
    

    注意这piecewise是一个反复无常的野兽。特别是,它需要将其x参数设置为数组,如果不是,则甚至不会尝试对其进行转换(numpy用语:x需要为ndarray,而不是array_like):

    >>> piecew(2.1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 4, in piecew
      File "/home/br/.local/lib/python2.7/site-packages/numpy/lib/function_base.py", line 690, in piecewise
        "function list and condition list must be the same")
    ValueError: function list and condition list must be the same
    >>> 
    >>> piecew(np.asarray([2.1]))
    array([ 0.01])
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看