gpt4 book ai didi

python - numpy.piecewise 中的多个部分

转载 作者:太空狗 更新时间:2023-10-29 20:56:27 26 4
gpt4 key购买 nike

我正在学习关于模糊系统的类(class),我学习了 my notes在我的电脑上。这意味着我不得不时不时地在电脑上画图。由于这些图表定义明确,我觉得用 numpy 绘制它们是个好主意(我用 LaTeX 做笔记,而且我在 python shell 上很快,所以我想我可以摆脱这个)。

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

Fuzzy Membership Function

为了绘制它,我尝试了以下代码作为 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 文件中,因此我也非常感谢在这些方面的任何帮助。

最佳答案

一般来说,numpy 数组非常擅长做一些明智的事情,当你只是像写数字一样编写代码时。链接比较是罕见的异常(exception)之一。您看到的错误本质上是这样的(被 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])

关于python - numpy.piecewise 中的多个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19578185/

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