首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy.piecewise中的多个部分

numpy.piecewise中的多个部分
EN

Stack Overflow用户
提问于 2013-10-25 06:53:51
回答 1查看 13.1K关注 0票数 8

我正在上一门关于模糊系统的课程,我在我的电脑上学习my notes。这意味着我必须时不时地在我的计算机上绘制图表。因为这些图定义得很好,所以我觉得用numpy绘制它们会是个好主意(我用LaTeX做笔记,而且我对python shell的了解很快,所以我想我可以不用管它)。

fuzzy membership functions的图形是高度分段的,例如:

为了绘制这个图,我尝试了下面的numpy.piecewise代码(这给了我一个隐秘的错误):

代码语言:javascript
复制
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文件中,因此我也希望得到这些方面的任何帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-25 21:13:12

一般来说,当你只是把数字当做数字来编写代码时,numpy数组非常擅长做一些有意义的事情。链接比较是少见的例外之一。你看到的错误本质上是这样的(被piecewise内部和ipython错误格式混淆了一点):

代码语言:javascript
复制
>>> 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的一个例子:

代码语言:javascript
复制
>>> 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):

代码语言:javascript
复制
>>> 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])
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19578185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档