Reputation: 11
I'm new to python, in this case, I want to put my function into 2d arrays, so I can plot the function. Here is my triangle function, I'm using it for fuzzy logic:
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
and I'm trying to make the array using numpy,
np.linspace
but I can't get it done,
I've tried to use the fuzzy library, but nothing works.
Upvotes: 1
Views: 6169
Reputation: 23773
Looks like a, b, c
are constants and z
is a np.linspace
between a
, and c
.
You can make use of Boolean Indexing , 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], ....]
When you use a numpy ndarray in a comparison expression the result is a boolean array:
>>> 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]
>>>
You can use a boolean array to select portions of an array that meet your condition:
>>> 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 ])
>>>
When you use boolean indexing in an assignment statement the right-hand-side is only assigned to the indices where the comparison is 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. ]
>>>
Upvotes: 2