comp.lang.idl-pvwave archive
Messages from Usenet group comp.lang.idl-pvwave, compiled by Paulo Penteado

Home » Public Forums » archive » Re: histogram question
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Switch to threaded view of this topic Create a new topic Submit Reply
Re: histogram question [message #26128] Wed, 08 August 2001 15:52 Go to next message
John-David T. Smith is currently offline  John-David T. Smith
Messages: 384
Registered: January 2000
Senior Member
"Gregory Y. Prigozhin" wrote:
>
> Folks,
> I am sure this problem must have an elegant solution
> that is not obvious to me:
>
> I have an array X. I need to make a histogram and throw away elements
> of the array with a high count rate, say with count rate above 5 times
> median count rate.
> Brute force way is ugly and inefficient when array is not small:
>
> plothist,X,xhist,yhist
> bad=xhist[where(yhist gt 5*median(yhist),count)]
> if count ne 0 then begin
> for ind=0,count-1 do begin
> X=X[where(X ne bad[ind])]
> endfor
> endif
>
> Any suggestions?

If I understand you correctly, then REVERSE_INDICES is your friend.

Try something like:

h=histogram(x,binsize=1,reverse_indices=r)
bad=where(h gt 5*median(h),cnt)
if cnt eq 0 then return

;; straightforward approach
for i=0,cnt-1 do begin
low=r[r[bad[i]] & n=r[r[bad[i]+1]]-low
inds=indgen(n)+low
if n_elements(list) eq 0 then list=[inds] else list=[list,inds]
endfor

now you have the list of bad indices into X in hand, to perform whatever
punishment is necessary.

This brings up an interesting sub-problem though. If you have a list
which consists of a series of pairs of indices, e.g.:

[1,5,7,12,15,18]

where each pair is intended to expand to the range within that pair:

[1,2,3,4,5,7,8,9,10,11,12,15,16,17,18]

how can you turn the former into the latter without a loop? This is
somewhat similar to Pavel's running chunk index problem earlier in the
year. Finding an answer is not trivial. It would apply directly to
this problem, where the pairs are adjacent elements in the reverse
indices vector. Any takers?

JD
Re: histogram question [message #26190 is a reply to message #26128] Fri, 10 August 2001 04:03 Go to previous message
alt is currently offline  alt
Messages: 28
Registered: August 2001
Junior Member
JD Smith <jdsmith@astro.cornell.edu> wrote in message news:<3B71C2AA.7E91E5BA@astro.cornell.edu>...
> for i=0,cnt-1 do begin
> low=r[r[bad[i]] & n=r[r[bad[i]+1]]-low
> inds=indgen(n)+low
> if n_elements(list) eq 0 then list=[inds] else list=[list,inds]
> endfor
>
> now you have the list of bad indices into X in hand, to perform whatever
> punishment is necessary.
>
It seems to be some misprint or my task misunderstanding. list is
indices into r, not into x.
for i=0,cnt-1 do begin
inds = r[ r[bad[i]] : r[bad[i]+1]-1 ]
if n_elements(list) eq 0 then list=[inds] else list=[list,inds]
endfor
We needn't to check r[bad[i]] NE r[bad[i]+1] because we adding only
not empty bins.
> This brings up an interesting sub-problem though. If you have a list
> which consists of a series of pairs of indices, e.g.:
>
> [1,5,7,12,15,18]
>
> where each pair is intended to expand to the range within that pair:
>
> [1,2,3,4,5,7,8,9,10,11,12,15,16,17,18]
>
> how can you turn the former into the latter without a loop? This is
> somewhat similar to Pavel's running chunk index problem earlier in the
> year. Finding an answer is not trivial. It would apply directly to
> this problem, where the pairs are adjacent elements in the reverse
> indices vector. Any takers?
From my experience it is much faster in such cases to write a DLM
module then to rack brains on how implement something not standart
into IDL operations. It would be wonderful if IDL has build in C
compiler so we could write C code (with some limitations of course)
just inside of our IDL code. As we do in C writing ASM.

Regards,
Altyntsev Dmitriy
Re: histogram question [message #26216 is a reply to message #26128] Thu, 09 August 2001 08:26 Go to previous message
billb is currently offline  billb
Messages: 5
Registered: August 2001
Junior Member
> how can you turn the former into the latter without a loop? This is
> somewhat similar to Pavel's running chunk index problem earlier in the
> year. Finding an answer is not trivial. It would apply directly to
> this problem, where the pairs are adjacent elements in the reverse
> indices vector. Any takers?
>

I've encountered a few areas where certain logic problems cannot be
solved without a loop in IDL. Usually, this always points to the fact
that there are certain IDL functions that (logically) insist upon
scalar parameters.

-Bill B.
  Switch to threaded view of this topic Create a new topic Submit Reply
Previous Topic: Re: Discussion on global variables in IDL
Next Topic: HDF files and memory leak

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ] [ PDF ]

Current Time: Fri Oct 10 14:26:58 PDT 2025

Total time taken to generate the page: 0.87815 seconds