Search code examples
pythonmultidimensional-arraynumpyshapesaverage

average numpy array but retain shape


I have a Numpy 3 axis array whose elements are 3 dimensional. I'd like to average them and return the same shape of the array. The normal average function removes the 3 dimensions and replace it with the average (as expected):

a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]],
              [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32)

b = np.average(a, axis=2)
# b = [[0.2, 0.3],
#      [0.4, 0.7]]

Result required:

# b = [[[0.2, 0.2, 0.2], [0.3, 0.3, 0.3]],
#      [[0.4, 0.4, 0.4], [0.7, 0.7, 0.7]]]

Can you do this elegantly or do I just have to iterate over the array in Python (which will be a lot slower compared to a powerful Numpy function).

Can you set the Dtype argument, for the np.mean function, to a 1D array perhaps?

Thanks.


Solution

  • >>> import numpy as np
    >>> a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]],
    ...               [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32)
    >>> b = np.average(a, axis=2)
    >>> b
    array([[ 0.2       ,  0.29999998],
           [ 0.40000001,  0.69999999]], dtype=float32)
    >>> c = np.dstack((b, b, b))
    >>> c
    array([[[ 0.2       ,  0.2       ,  0.2       ],
            [ 0.29999998,  0.29999998,  0.29999998]],
    
           [[ 0.40000001,  0.40000001,  0.40000001],
            [ 0.69999999,  0.69999999,  0.69999999]]], dtype=float32)