[ncl-talk] running sequence of 0s and 1s [SEC=UNCLASSIFIED]

Peter Gibson peter.gibson at unsw.edu.au
Wed Mar 8 15:31:08 MST 2017


Thanks Griff and Dennis - this is a useful function and the loop doesn't appear to cause problems for me on a reasonably large data.


While it is a rather 'specific' function as you say, I suggest it may be useful also to other NCL users. For example, those interested in examining a sequence of dry/wet days in the context of drought and retaining this information as an index.


Thanks again.

Peter

________________________________
From: Dennis Shea <shea at ucar.edu>
Sent: Thursday, March 9, 2017 2:03:11 AM
To: Griffith Young
Cc: Peter Gibson; ncl-talk at ucar.edu
Subject: Re: [ncl-talk] running sequence of 0s and 1s [SEC=UNCLASSIFIED]

Griff is correct that interpreted languages can be slow executing do loops. However, I always suggest doing a simple timing test like below. On my MAC, with, N=10000
     gibson_young: N=10000:  ===> 0.03022 seconds

------------------------------------
undef("gibson_young")
function gibson_young(q[*]:numeric)
begin
  nq   = dimsizes(q)
  qsum = conform(q, 0, -1)   ; initialize to 0

  do n=0,nq-1
    if (q(n).eq.0) then
        t = 0
    end if

    if (q(n).eq.1) then
        qsum(n) = t
        t       = t + 1
    end if
  end do

  return(qsum)
end
;=====================================
;                  MAIN
;=====================================
;
;   desired result: 0 0 0 0 1 0 0 1 2 3 4 0 0 1 2 0
  q = (/0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0/)
  qsum = gibson_young(q)
  print(q+"   "+qsum)

;========

  N  = 10000
  x  = random_uniform(-10,10,N)
  x  = where(x.lt.0, 0, 1)

  tStrt  = get_cpu_time()
  xsum   = gibson_young(x)
  print("gibson_young: N="+N+ ": " + (get_cpu_time() - tStrt))

 ;print(xsum)

On Tue, Mar 7, 2017 at 9:43 PM, Dennis Shea <shea at ucar.edu<mailto:shea at ucar.edu>> wrote:
Never underestimate Aussie brute force!


==========
undef("gibson_young")
function gibson_young(q[*]:numeric)
local nq, qsum, n, t
begin
  nq   = dimsizes(q)
  qsum = conform(q, 0, -1)   ; initialize to 0

  do n=0,nq-1
    if (q(n).eq.0) then
        t = 0
    end if

    if (q(n).eq.1) then
        qsum(n) = t
        t       = t + 1
    end if
  end do

  return(qsum)
end
;
;   desired result: 0 0 0 0 1 0 0 1 2 3 4 0 0 1 2 0
  q = (/0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0/)
  qsum = gibson_young(q)
  print(q+"   "+qsum)

===



(0)    0   0
(1)    0   0
(2)    0   0
(3)    1   0
(4)    1   1
(5)    0   0
(6)    1   0
(7)    1   1
(8)    1   2
(9)    1   3
(10)    1   4
(11)    0   0
(12)    1   0
(13)    1   1
(14)    1   2


On Tue, Mar 7, 2017 at 9:19 PM, Griffith Young <griffith.young at bom.gov.au<mailto:griffith.young at bom.gov.au>> wrote:
Hello Peter,

Not if you go to the casino and are doubling up your bet.

This code seems to work...

v = {vector or array of 1's and 0's}
c = v
t = 0
do i = 0, dimsizes(v) - 1
    if v(i) .eq. 0 then
        c(i) = 0
        t = 0
    end if
    if (v(i) .eq. 1) then
        c(i) = t
        t = t + 1
    end if
end do

Caveat: "Since NCL is an interpreted language, it is best to avoid do loops as much as possible. They can cause considerable slow downs. Small loops should not be a problem."

Regards, Griff.


From: ncl-talk-bounces at ucar.edu<mailto:ncl-talk-bounces at ucar.edu> [mailto:ncl-talk-bounces at ucar.edu<mailto:ncl-talk-bounces at ucar.edu>] On Behalf Of Dennis Shea
Sent: Wednesday, 8 March 2017 2:59 PM
To: Peter Gibson
Cc: ncl-talk at ucar.edu<mailto:ncl-talk at ucar.edu>
Subject: Re: [ncl-talk] running sequence of 0s and 1s

Sorry, no. Pretty specialized function ...
: 0 0 0 1 1 0 1 1 1 1 1 0 1 1 1 0 ...  input: 1st 1 is a flag
: 0 0 0 0 1 0 0 1 2 3 4 0 0 1 2 0

On Tue, Mar 7, 2017 at 8:17 PM, Peter Gibson <peter.gibson at unsw.edu.au<mailto:peter.gibson at unsw.edu.au>> wrote:
Hello,

Is there a function to calculate the running length of 0/1s in a sequence in NCL?

for example if I had a vector     v : 0 0 0 1 1 0 1 1 1 1 1 0 1 1 1 0 ...
the running sequence would be   : 0 0 0 0 1 0 0 1 2 3 4 0 0 1 2 0 ...

I see the function dim_numrun counts the number of unique sequence lengths which is similar but not exactly what I am after ....



Thanks,

Peter

_______________________________________________
ncl-talk mailing list
ncl-talk at ucar.edu<mailto:ncl-talk at ucar.edu>
List instructions, subscriber options, unsubscribe:
http://mailman.ucar.edu/mailman/listinfo/ncl-talk



-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20170308/cda44aec/attachment.html 


More information about the ncl-talk mailing list