3
$\begingroup$

I am doing a large data-set computation. Among those computational steps, in one step I need to do a sum with a pattern: Sum the elements with same interval.

For example, for a list from 1 to 9; With the interval being set to 3 manually. So it could be other values in different cases.

And the list would be calculated as:

1 + 4 + 7 = 12;
2 + 5 + 8 = 15;
3 + 6 + 9 = 18;

So for list = Range[1,9],the final desired result would be {12,15,18} in this example. I attached an illustration for a further elaboration: sum the element with the same color when interval = 3:

The example illustration, sum same color with interval equals to 3 in this case

Thanks for @Chris's Answer, the above case could be solved by:

 Total[Partition[Range[9], 3]]

Edit my original question from here:

But what I actually want to do is only sum "N" numbers in a time. N is settled and when N = 3 in below example:

enter image description here

It should be computed by :

1 + 4 + 7 = 12;
2 + 5 + 8 = 15;
3 + 6 + 9 = 18;
10 + 13 + 16 = 39;
11 + 14 + 17 = 42;
12 + 15 + 18 = 45;

Hereby the result would be {12,15,18,39,42,45}

I think this might be not hard, but I just can't think it very clearly when I want to utilize the parallelization characteristics of MMA and trying to avoid Unpacked Array results.

$\endgroup$
  • $\begingroup$ is the length of the input list always a multiple of n? If not, what is the desired output for inputs Range[19] and Range[20]? $\endgroup$ – kglr Dec 5 '18 at 3:09
  • $\begingroup$ The length of list will always be Mod[Length[list],N] = 0, so no worry about corner cases $\endgroup$ – cj9435042 Dec 5 '18 at 3:13
4
$\begingroup$
Total[Partition[Range[9], 3]]

{12, 15, 18}

Update for revised question:

r = Range[18]    

Total /@ Flatten[Partition[#, 3] & /@ {r[[1 ;; ;; 3]], r[[2 ;; ;; 3]], r[[3 ;; ;; 3]]}, 1]
$\endgroup$
  • $\begingroup$ Hi Chris, sorry I wasn't clarify the problem clearly. I just updated my question would you still interest to help? $\endgroup$ – cj9435042 Dec 5 '18 at 1:30
3
$\begingroup$

Using the six-argument form of Partition:

Join @@ Partition[Partition[Range[9], 3], 3, 3, {1, 1}, {}, Plus]

{12, 15, 18}

Join @@ Partition[Partition[Range[18], 3], 3, 3, {1, 1}, {}, Plus]

{12, 15, 18, 39, 42, 45}

More generally,

ClearAll[partsums]
partsums[lst_List, n_Integer] := Join@@Partition[Partition[lst, n], n, n, {1,1}, {}, Plus]

Examples:

partsums[Range[18], 3]

{12, 15, 18, 39, 42, 45}

Grid[Prepend[Table[{i, Column[i Range[7]], Column[partsums[Range@#, i] & /@ 
    (i Range[7])]}, {i, {3, 4, 5}}], {"n", "Length@list" , "f[list, n]"}], 
    Alignment -> Center, Dividers -> All] // TeXForm

$\small\begin{array}{|c|c|c|} \hline \text{n} & \text{Length@list} & \text{f[list, n]} \\ \hline 3 & \begin{array}{l} 3 \\ 6 \\ 9 \\ 12 \\ 15 \\ 18 \\ 21 \\ \end{array} & \begin{array}{l} \{1,2,3\} \\ \{5,7,9\} \\ \{12,15,18\} \\ \{12,15,18,10,11,12\} \\ \{12,15,18,23,25,27\} \\ \{12,15,18,39,42,45\} \\ \{12,15,18,39,42,45,19,20,21\} \\ \end{array} \\ \hline 4 & \begin{array}{l} 4 \\ 8 \\ 12 \\ 16 \\ 20 \\ 24 \\ 28 \\ \end{array} & \begin{array}{l} \{1,2,3,4\} \\ \{6,8,10,12\} \\ \{15,18,21,24\} \\ \{28,32,36,40\} \\ \{28,32,36,40,17,18,19,20\} \\ \{28,32,36,40,38,40,42,44\} \\ \{28,32,36,40,63,66,69,72\} \\ \end{array} \\ \hline 5 & \begin{array}{l} 5 \\ 10 \\ 15 \\ 20 \\ 25 \\ 30 \\ 35 \\ \end{array} & \begin{array}{l} \{1,2,3,4,5\} \\ \{7,9,11,13,15\} \\ \{18,21,24,27,30\} \\ \{34,38,42,46,50\} \\ \{55,60,65,70,75\} \\ \{55,60,65,70,75,26,27,28,29,30\} \\ \{55,60,65,70,75,57,59,61,63,65\} \\ \end{array} \\ \hline \end{array}$

$\endgroup$
2
$\begingroup$
Total@Take[Range@9, {#, -1, 3}] & /@ Range@3    

{12, 15, 18}

or..

Total /@ Transpose@Partition[Range@9, 3]   

{12, 15, 18}

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.