Block mean of numpy 2D array Block mean of numpy 2D array numpy numpy

Block mean of numpy 2D array


Numpy methods are going to beat python loops almost always, so I am going to skip your 1.

As for 2, in this particular case the following works:

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)>>> aarray([[[ 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 the reshape. For a general case where you want blocks of n columns, the following is an option

a = a.reshape((a.shape[0], -1, n))

Your concerns in 3 are mostly unwarranted. reshape returns a view of the original array, not a copy, so the conversion to 3D only requires altering the shape and strides attributes of the array, without having to copy any of the actual data.

EDITTo be sure that reshaping does not copy the array, but returns a view, do the reshape as

a.shape = a = a.reshape((a.shape[0], -1, n))

The example in the docs goes along the lines of:

>>> a = np.arange(12).reshape(3,4)>>> b = a.T>>> b.shape = (12,)Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: incompatible shape for a non-contiguous array

And in general there are only problems if you have been doing transpose, rollaxis, swapaxes or the like on your array.


I can answer ur number 1).

vstack([mean(a[:,4*i:4*(i+1)],axis=1) for i in range(3)]).T