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.
Have you considered using broadcasting? Here is more info about broadcasting if you're new to the concept.
Here is an example using
broadcast_arrays
, keep in mind that theb
produced here bybroadcast_arrays
should be treated as read only, you should make a copy if you want to write to it:Ok, CAUTION I don't have my masters in numpyology yet, but just playing around, I came up with:
This is for an arbitrary axis:
array
is the ndimentional array andaxis
is the axis to averageHere is a method that avoids making copies:
Or if you don't want to overwrite
a
: