Numpy methods will almost always beat python loops, so I will skip your 1.
As for 2, in this particular case, the following work is performed:
a = np.array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]]) a = a.reshape(2, 3, 4) >>> a array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) >>> np.mean(a, axis=1) array([[ 4., 5., 6., 7.], [ 16., 17., 18., 19.]])
The trick is in reshape . For the general case, when you need n column blocks, the following option
a = a.reshape((a.shape[0], -1, n))
Your concerns regarding 3 are largely unfounded. reshape returns a representation of the original array, not a copy, so converting to 3D requires changing the shape and strides attributes of the array, without having to copy any actual data.
EDIT To make sure reformatting does not copy the array, but returns a view, change the form as
a.shape = a = a.reshape((a.shape[0], -1, n))
The example in docs matches the lines:
>>> a = np.arange(12).reshape(3,4) >>> b = aT >>> b.shape = (12,) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: incompatible shape for a non-contiguous array
In general, there are only problems if you did transpose , rollaxis , swapaxes or the like in your array.