2016-10-10 33 views
1

私はPythonには新しく、この場合、関数を2次元配列に入れたいので、関数をプロットすることができます。ここに私の三角関数は、私がファジーロジックのためにそれを使用しています、次のとおりです。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を作るしようとしているが、私はそれを成し遂げることができない、 ファジーライブラリを使用するが、何も動作しない。 a, b, cは定数であり、za、とcnp.linspaceあるよう

+0

linspaceを使ってどのアレイを変換しようとしていますか?あなたがこれをしようとすると、どんなエラーが出るのですか? – Praveen

+1

例*入力* - '' 'z、a、b、c'''を表示してください。と希望の出力。あなたが参照している[これは機能です](http://www.dma.fi.upm.es/recursos/aplicaciones/logica_borrosa/web/fuzzy_inferencecia/funpert_en.htm#triangular)ですか? – wwii

+0

[numpy.triu](http://docs.scipy.org/doc/numpy/reference/generated/numpy.triu.html)、おそらく[類似の投稿](http://stackoverflow.com/質問/ 8905501 /抽出 - 上部 - 下部 - 三角形の - 部分 - 数 - 数字マトリックス) –

答えて

2

が見えます。

あなたは比較式でnumpyのndarrayを使用すると、結果がブール配列ですSciPy 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], ....] 

enter image description here


Boolean Indexingを利用することができます:

>>> 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.  ] 
>>> 
+0

私は2つの関数の三角形と台形を得て、それを1つのグラフにプロットしたいのですが、もちろんx軸の長さはcの値によって制限されません。例:x軸の長さは20、台形関数には独自のa、b、c、それを行う方法がありますか?そのようなファジー論理メンバーシップ関数のグラフ – prasta

+0

@prasta - '' 'z'''が*より大きい*範囲を持つようにしたい場合は、[numpy.linspace](http://docs.scipy.org/doc/numpy /reference/generated/numpy.linspace.html#numpy-linspace) '' 'z'''を実行すると引数の開始と終了を行います。三角関数を適応させて台形関数を書く必要があります。 – wwii

+0

@prasta - 関数に適切な引数を渡すだけです。 '' 'functools.partial''']を使って' 'a、b、c''引数を固定して' '' triangle''と '' trapezoid''から関数を作成することもできますhttps://docs.python.org/3/library/functools.html#functools.partial)。あなたは '' a、b、c''の値を変えて必要なだけ多くの部分関数を作成し、部分関数に '' '' ''を渡すことができます。 – wwii