Question on Total and Mean
The observed behavior appears to caused by Mean
having different requirements than Total
. Or you might say it is being fussier.
The Details and Options section of the Documentation Center article on Total
says
For a 2D array or matrix, Total[list] totals for each column
That means Total[list]
effectively transposes data
, so a truly equivalent application of Mean
would be
SeedRandom[42];
data = Table[{RandomReal[{-1., 1.}, {2, 2}], RandomReal[{-1., 1.}, {3, 3}]}, 10];
Mean /@ Transpose[data]
{{{-0.0841252, 0.30287}, {0.188753, 0.258856}}, {{-0.219886, 0.0948545, 0.310493}, {-0.127705, 0.0855042, 0.508691}, {0.113957, 0.328553, 0.405479}}}
which is what
Total[data]/Length[data]
gives.
This seems to be one of those cases where the documentation tries to illustrate with a simple analogy which unfortunately is only superficially true.
I am going to quote Kuba directly as I think he expressed this quite well:
Documentation is usually correct from a perspective of a beginner who doesn't care/know context/kernels/links etc. When you try to develop something complex then those reckless sentences have major implications. Sometimes it is a matter of few tests and sometimes you waste two days on debugging and discussions here.
And quoting myself:
Quite often the documentation is not complete in describing the behavior of Mathematica functions. In my opinion a user has to accept in vivo behavior as at least co-authoritative with the documentation. I know this causes consternation for those who want a rigorous language definition but as far as I know from the beginning we have never been provided with one.
The error message itself appears to both explain the problem and clearly indicate that Mean
was not intended to work this way. I far simpler example may be used to provoke it:
dat = {{{1, 2}, {3}}, {{4, 5}, {6}}};
Mean[dat]
Mean::rectt: Rectangular array expected at position 1 in Mean[{{{1,2},{3}},{{4,5},{6}}}]. >>
Total
again works as desired:
Total[dat]/Length[dat]
{{5/2, 7/2}, {9/2}}
Mean
expects a rectangular array as the message indicates. So, as I see m_goldberg just beat me to posting, we need to make sure that what is passed to Mean
is a rectangular array, and we can do that by separating our dat
:
Mean @ dat[[All, 1]]
Mean @ dat[[All, 2]]
{5/2, 7/2} {9/2}
Or more elegantly as m_goldberg wrote, using Transpose
:
Mean /@ (dat\[Transpose])
{{5/2, 7/2}, {9/2}}