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