Testing The Number Of Consecutive Values In Numpy Array
How could I write a code that calculates how many consecutive times there was a positive , negative and zero values within the a array. How would I be able to compute this? import
Solution 1:
You could use np.diff
for this
a = np.array([0., -5., 4., -3., 0., -2.])
diff = np.diff(a)
print("Consecutive Positive results: ", np.count_nonzero(diff > 0))
print("Consecutive Zero results: ", np.count_nonzero(diff == 0))
print("Consecutive Negative results: ", np.count_nonzero(diff < 0))
Output:
Consecutive Positive results: 2
Consecutive Zero results: 0
Consecutive Negative results: 3
EDIT
Did not read the question properly. Here is my new attempt:
a = np.array([ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , -8. , 0. , 0. , 304.2, -27.8, -15.4,
0. , 0. , -14.8, 0. , 6.4, 14.4, 0. , -10.6, 55.8,
23.1, 0. , 27.9, 34.7, 62. , 23. , 41.6, 30.7, 30.5,
34.9, 40.9, 21.7, 31.3, 19.9, 32.8, 26.2, 14.8, 18.9,
15.2, 23.8, 21.9, 112.7, 38.4, 34.4])
sign = np.sign(a) # we only care about the sign
# find runs, cred to https://stackoverflow.com/a/54597990/14923227
def count_consecutive(arr, n):
# pad a with False at both sides for edge cases when array starts or ends with n
d = np.diff(np.concatenate(([False], arr == n, [False])).astype(int))
# subtract indices when value changes from False to True from indices where value changes from True to False
return np.flatnonzero(d == -1) - np.flatnonzero(d == 1)
print("Consecutive Positive results: ", np.max(count_consecutive(sign, 1)))
print("Consecutive Zero results: ", np.max(count_consecutive(sign, 0)))
print("Consecutive Negative results: ", np.max(count_consecutive(sign, -1)))
Output:
Consecutive Positive results: 22
Consecutive Zero results: 21
Consecutive Negative results: 2
Solution 2:
It seems numpy doesn't have a build-in groupby
function that would make this a little simpler, but we can use itertools.groupby
instead. The idea is to use groupby
to combine consecutive elements satisfying some condition (positive, negative, or zero) and then find the largest of those groups.
>>> a = np.array([
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., -8., 0., 0.,
304.2, -27.8, -15.4, 0., 0., -14.8, 0., 6.4, 14.4, 0., -10.6, 55.8,
23.1, 0., 27.9, 34.7, 62., 23., 41.6, 30.7, 30.5, 34.9, 40.9, 21.7,
31.3, 19.9, 32.8, 26.2, 14.8, 18.9, 15.2, 23.8, 21.9, 112.7, 38.4, 34.4
])
>>> max(map(len, (list(g) for k, g in itertools.groupby(a>0) if k)))
22
>>> max(map(len, (list(g) for k, g in itertools.groupby(a==0) if k)))
21
>>> max(map(len, (list(g) for k, g in itertools.groupby(a<0) if k)))
2
Solution 3:
import numpy as np
a = np.array([0., -5., 4., -3., 0., -2.])
x = (a > 0).sum()
y = (a == 0).sum()
z = (a < 0).sum()
print("Consecutive Positive results: "+ str(x))
print("Consecutive Zero results: "+ str(y))
print("Consecutive Negative results: "+ str(z))
Post a Comment for "Testing The Number Of Consecutive Values In Numpy Array"