【问题标题】:python, plot triangular function into 2d arrayspython,将三角函数绘制成二维数组
【发布时间】:2019-04-03 19:23:35
【问题描述】:

我是 python 新手,在这种情况下,我想将我的函数放入二维数组中,以便绘制函数。这是我的三角函数,我将它用于模糊逻辑:

def triangle (z,a,b,c):
    if (z<=a) | (z>=c):
        y = 0
    elif (a<=z) & (z<=b):
        y = (z-a) / (b-a)
    elif (b<=z) & (z<=c):
        y = (b-z) / (c-b)
    return y

我正在尝试使用 numpy 创建数组, np.linspace 但我做不到, 我尝试使用模糊库,但没有任何效果。

【问题讨论】:

  • 您要使用 linspace 转换哪个数组?尝试执行此操作时遇到什么错误?
  • 请展示一个例子输入 - z,a,b,c;和所需的输出。你指的是this the function吗?
  • 查看numpy.triu,可能还有similar post
  • 是的z是a和c之间的值,就像模糊逻辑中的清晰值,所以我要试试你的代码,谢谢你的帮助
  • @AzizAlto - 你将如何在 OP 的函数中使用 numpt.triu?

标签: python arrays numpy triangular


【解决方案1】:

看起来a, b, c 是常量,z 是介于ac 之间的np.linspace

您可以使用Boolean IndexingSciPy cookbook/Indexing

a = 1
b = 2
c = 3

def triangle (z, a = a, b = b, c = c):
    y = np.zeros(z.shape)
    y[z <= a] = 0
    y[z >= c] = 0
    first_half = np.logical_and(a < z, z <= b)
    y[first_half] = (z[first_half]-a) / (b-a)
    second_half = np.logical_and(b < z, z < c)
    y[second_half] = (c-z[second_half]) / (c-b)
    return y

z = np.linspace(a, c, num = 51)
y = triangle(z, a, b, c)

q = np.vstack((z, y)) # shape = (2, 50) ... [[z, z, z, ...], [y, y, y, ...]]
q =  q.T # shape = (50, 2) ... [[z, y], [z, y], ....]


当您在比较表达式中使用 numpy ndarray 时,结果是一个布尔数组:

>>> q = np.linspace(0, 20, num = 50)
>>> print(q)
[  0.           0.40816327   0.81632653   1.2244898    1.63265306
   2.04081633   2.44897959   2.85714286   3.26530612   3.67346939
   4.08163265   4.48979592   4.89795918   5.30612245   5.71428571
   6.12244898   6.53061224   6.93877551   7.34693878   7.75510204
   8.16326531   8.57142857   8.97959184   9.3877551    9.79591837
  10.20408163  10.6122449   11.02040816  11.42857143  11.83673469
  12.24489796  12.65306122  13.06122449  13.46938776  13.87755102
  14.28571429  14.69387755  15.10204082  15.51020408  15.91836735
  16.32653061  16.73469388  17.14285714  17.55102041  17.95918367
  18.36734694  18.7755102   19.18367347  19.59183673  20.        ]
>>> print(q < 5)
[ True  True  True  True  True  True  True  True  True  True  True  True
  True False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False]
>>> print(q > 15)
[False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False  True  True  True  True  True  True  True  True  True  True  True
  True  True]
>>> print(np.logical_and(q > 5, q < 15))
[False False False False False False False False False False False False
 False  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True False False False False False False False False False False False
 False False]
>>> 

您可以使用布尔数组选择满足您条件的数组部分:

>>> q[np.logical_and(q > 7, q < 11)]
array([  7.34693878,   7.75510204,   8.16326531,   8.57142857,
         8.97959184,   9.3877551 ,   9.79591837,  10.20408163,  10.6122449 ])
>>> 

当您在赋值语句中使用布尔索引时,右侧仅分配给比较为True的索引:

>>> q[np.logical_and(q > 7, q < 11)] = -1
>>> print(q)
[  0.           0.40816327   0.81632653   1.2244898    1.63265306
   2.04081633   2.44897959   2.85714286   3.26530612   3.67346939
   4.08163265   4.48979592   4.89795918   5.30612245   5.71428571
   6.12244898   6.53061224   6.93877551  -1.          -1.          -1.          -1.
  -1.          -1.          -1.          -1.          -1.          11.02040816
  11.42857143  11.83673469  12.24489796  12.65306122  13.06122449
  13.46938776  13.87755102  14.28571429  14.69387755  15.10204082
  15.51020408  15.91836735  16.32653061  16.73469388  17.14285714
  17.55102041  17.95918367  18.36734694  18.7755102   19.18367347
  19.59183673  20.        ]
>>> 

【讨论】:

  • 所以如果我有 2 个函数三角形和梯形,我想将它绘制成一个图形,当然 x 轴的长度不受 c 值的限制,例如: x轴是20,三角形和梯形函数有自己的a,b,c,怎么办?它就像模糊逻辑隶属函数图
  • @prasta - 如果您希望z 具有更大 范围,则在您创建z 时更改numpy.linspace 开始和停止参数。您需要通过调整三角形函数来编写梯形函数。
  • @prasta - 只需将适当的参数传递给函数。您还可以从triangletrapezoid 创建函数,并使用functools.partial 固定a, b, c 参数。您可以使用不同的 a, b, c 值创建任意数量的部分函数,​​只需将 z 传递给部分函数。
  • 所以,我尝试将启动和停止功能从 numpy.linspace 更改为 np.linspace(0, 20, num=51) ,然后我无法让我的三角形具有 1.0 值,它只有到 0.9。它没有到达图表的顶部
  • @prasta,linspace 将在startstop 之间为您提供num 等距点,因此不能保证您获得等于b 的值。如果你使num 足够大,你应该得到足够接近b 的点,或者可以使用开始和停止值。你了解你的函数是如何工作的吗?您应该花一些时间阅读 numpy 文档,并尝试使用 linspace 和布尔索引,以便了解它是如何工作的 - 然后您可以调整代码以满足您的需求。
猜你喜欢
  • 2015-03-02
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
相关资源
最近更新 更多