Получение среднего значения множества осей массива numpy
В numpy есть быстрый способ вычисления среднего значения по нескольким осям? Я вычисляю среднее значение для всех, кроме оси 0 n-мерного массива.
В настоящее время я делаю это:
for i in range(d.ndim - 1):
d = d.mean(axis=1)
Мне интересно, есть ли решение, которое не использует цикл python.
Ответы
Ответ 1
Мой подход состоял в том, чтобы изменить массив, чтобы сгладить все более высокие измерения, а затем запустить среднее значение на оси 1. Это то, что вы ищете?
In [14]: x = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
In [16]: x.reshape((x.shape[0], -1)).mean(axis=1)
Out[16]: array([ 2.5, 6.5])
(шаг 2 просто вычисляет произведение длин более высоких dims)
Ответ 2
В numpy 1.7 вы можете указать несколько осей на np.mean
:
d.mean(axis=tuple(range(1, d.ndim)))
Я предполагаю, что это будет выполняться аналогично другим предлагаемым решениям, если только изменение размера массива для сглаживания всех измерений не приведет к копированию данных, и в этом случае это будет намного быстрее. Таким образом, это, вероятно, даст более стабильную производительность.
Ответ 3
Вы также можете использовать numpy.apply_over_axes:
import numpy as np
x = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
y = np.apply_over_axes(np.mean, x, (1, 2))
y = array([[[ 2.5]],[[ 6.5]]])
Ответ 4
Следуя предложению @dsg101, это то, что вам нужно?
>>> import numpy as np
>>> d=np.reshape(np.arange(5*4*3),[5,4,3])
>>> d
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]],
[[24, 25, 26],
[27, 28, 29],
[30, 31, 32],
[33, 34, 35]],
[[36, 37, 38],
[39, 40, 41],
[42, 43, 44],
[45, 46, 47]],
[[48, 49, 50],
[51, 52, 53],
[54, 55, 56],
[57, 58, 59]]])
>>> np.mean(np.reshape(d,[d.shape[0],np.product(d.shape[1:])]),axis=1)
array([ 5.5, 17.5, 29.5, 41.5, 53.5])