2013-07-01 2 views
13

В numpy есть быстрый способ вычисления среднего значения по нескольким осям? Я вычисляю среднее значение на всех, кроме оси 0 n-мерного массива.Получение среднего значения множества осей массива numpy

В настоящее время я делаю это;

for i in range(d.ndim - 1): 
    d = d.mean(axis=1) 

Мне интересно, есть ли решение, которое не использует цикл питона.

ответ

8

Мой подход состоял в том, чтобы изменить матрицу, чтобы сгладить все более высокие измерения, а затем запустить среднее значение по оси 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 просто вычисляет произведение длин высших тускнеет)

+2

Спасибо! Кроме того, вместо high_dims можно использовать -1. – dsg101

+0

@ dsg101 потрясающий! Редактирование сейчас! – acjay

0

Исходя из предположения о @ 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]) 
+0

Да, я думаю, что это будет быстрее, чем OP soln. – dsg101

+0

'np.product (d.shape [1:])' лучше написано '-1' – Eric

25

В Numpy 1.7 вы можете дать несколько ось np.mean:

d.mean(axis=tuple(range(1, d.ndim))) 

Я предполагаю, что это будет работать так же, как другие предлагаемые решения, если изменения формы массива, чтобы сгладить все размеры не вызывает копию данные, и в этом случае это должно быть намного быстрее. Таким образом, это, вероятно, даст более последовательную производительность.

+0

Отлично! Тем не менее, я набрал 1.6. – dsg101

+0

Я не могу подтвердить, что эта функция существует, но не в версии 1.7.1 или версии 1.8.2 numpy. Желательное мышление? – j08lue

+0

Вы пробовали, и это не сработало? Это было там в 1.7, поверьте мне. Изменение было сделано для всех ufuncs, поэтому оно автоматически распространялось на все функции, такие как 'np.mean', которые полагаются на' np.add'. Он не был добавлен в документы «mean» и других подобных функций, хотя есть [открытый PR] (https://github.com/numpy/numpy/pull/5146), чтобы исправить это. Но вы можете посмотреть [документы np.sum'] (https://github.com/numpy/numpy/pull/5146), которые были обновлены и имеют соответствующее изменение, помеченное как * Новое в версии 1.7. 0. * – Jaime

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]]]) 
Смежные вопросы