[Numpy-discussion] Accumulate values that are below threshold
Stéfan van der Walt
stefan at sun.ac.za
Thu Jan 8 01:36:41 EST 2009
Hi Bevan
Since the number of output elements are unknown, I don't think you can
implement this efficiently using arrays. If your dataset isn't too
large, a for-loop should do the trick. Otherwise, you may have to run
your code through Cython, which optimises for-loops around Python
lists.
thresh = 1.0
carry = 0
output = []
for idx, val in data:
carry += val
if (carry - thresh) >= -1e-15:
output.append((idx, carry))
carry = 0
The comparison line above, "(carry - thresh0 >= -1e-15", may look
strange -- it basically just does "carry >= thresh". For some reason
I don't quite understand, when accumulating floats, it sometimes
happens that "1.0 != 1.0", so I use 1e-15 as protection.
Regards
Stéfan
2009/1/8 Bevan Jenkins <bevan07 at gmail.com>:
> Hello,
>
> Sometimes the hardest part of a problem is articulating it. Hopefully I can
> describe what I am trying to do - at least enough to get some help.
>
> I am trying to compare values to a threshold and when the values are lower than
> the threshold they are added to the value in my set until the threshold is
> reached. Everytime the threshold is reached I want the index and value
> (accumulated).
>
> Hopefully the example below will help
>
> threshold =1.0
> for indx,val in enumerate(Q):
> print indx,val
>
> 0 100.0
> 1 20.0
> 2 16.0
> 3 7.0
> 4 3.0
> 5 1.5
> 6 0.8
> 7 0.6
> 8 0.5
> 9 0.2
> 10 0.2
> 11 0.1
> 12 0.1
>
> The output I would like is (number of elements and value)
> 0 100.0
> 1 20.0
> 2 16.0
> 3 7.0
> 4 3.0
> 5 1.5
> 7 1.4
> 11 1.0
>
>
> The 1st 6 elements are easy as they are all greater than or equal to the
> threshold(1.0). Once the values drop below the threshold the next value is
> added until the threshold is reached.
>
>
> Any help is appreciated,
> Bevan Jenkins
More information about the NumPy-Discussion
mailing list