families=.55e6 $ (i.100000)
   val =: 55e6 $ 1
   famTotal =: families +//. val

(famTotal{~(i.~~.) familie)  also works.

   ts'(1-~ +/\ (~:families)) { famTotal'        NB. JB
0.9683929 1.6777253e9
   ts'famTotal{~(i.~~.) families'               NB. REB
0.59730098 1.0737444e9
   ts'(;ndx){famTotal#~#@>ndx=: families </.i.#families'        NB. RM
3.0793607 2.6862264e9


R.E. Boss


> -----Original Message-----
> From: [email protected] [mailto:programming-
> [email protected]] On Behalf Of Raul Miller
> Sent: maandag 9 maart 2015 6:11
> To: Programming forum
> Subject: Re: [Jprogramming] distributing nub to appropriate positions
> 
> This might work?
>   ndx=: families </.i.#families
>   (;ndx){famTot#~#@>ndx
> 
> Thanks,
> 
> --
> Raul
> 
> On Mon, Mar 9, 2015 at 12:41 AM, Joe Bogner <[email protected]>
> wrote:
> > You are right. It won't be that easy since they are not adjacent. They
are
> > spread throughout in no pattern. That's the downside of using simple
test
> > data. I am glad you spotted it.
> >
> > I could have each row search for its family total in the table of family
> > totals. I was concerned it would be slow and was hopeful there was a
more
> > efficient way. I should probably test it before jumping to that
conclusion
> > On Mar 9, 2015 12:25 AM, "Raul Miller" <[email protected]> wrote:
> >
> >> That'll work if your families are all adjacent.
> >>
> >> If they can be shuffled you'll need to do a bit more work.
> >>
> >> (But if they are not shuffled, why bother?)
> >>
> >> Thanks,
> >>
> >> --
> >> Raul
> >>
> >> On Mon, Mar 9, 2015 at 12:22 AM, Joe Bogner <[email protected]>
> wrote:
> >> > This seems like it may be a viable solution:
> >> >
> >> > (1-~ +/\ (~:families)) { famTotal
> >> >
> >> > On Mon, Mar 9, 2015 at 12:15 AM, Joe Bogner <[email protected]>
> wrote:
> >> >
> >> >> I am doing a +//. on a very large array that I need redistribute the
> >> >> results back to the original positions.
> >> >>
> >> >> The dictionary has a solution that works well on small arrays[1],
but
> >> does
> >> >> not work on my large array since it's using = to self classify
> >> >>
> >> >> Example:
> >> >>
> >> >> NB. create 3 fake families across 100 rows
> >> >> families=: 1,(98$2),3
> >> >> val=: 100 $1
> >> >>
> >> >> NB. sum by family
> >> >> ] famTotal =: families +//. val
> >> >> 1 98 1
> >> >>
> >> >> NB. desired output, result distributed to each row
> >> >> ] desired =: famTotal ((+/ .*)=) families
> >> >> 1 98 98 .... 1
> >> >>
> >> >>
> >> >> NB. confirms desired matches family total
> >> >>    (~. ( i.~ families)) { desired
> >> >> 4 3 3
> >> >>
> >> >> For my very large array:
> >> >>
> >> >> families=.55e6 $ (i.100000)
> >> >> val =: 55e6 $ 1
> >> >> famTotal =: families +//. val
> >> >>
> >> >> desired =: famTotal ((+/ .*)=) families
> >> >> |out of memory
> >> >>
> >> >>
> >> >> The reason why is because = families results in a huge array.
> >> >>
> >> >> How can I accomplish the same goal efficiently?
> >> >>
> >> >>
> >> >>
> >> >> 1 - http://www.jsoftware.com/help/dictionary/d221.htm
> >> >> 2 - http://www.jsoftware.com/jwiki/Vocabulary/eq
> >> >>
> >> >
----------------------------------------------------------------------
> >> > For information about J forums see
> http://www.jsoftware.com/forums.htm
> >> ----------------------------------------------------------------------
> >> For information about J forums see
> http://www.jsoftware.com/forums.htm
> >>
> > ----------------------------------------------------------------------
> > For information about J forums see
> http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to