эффективное усреднение матрицы - PullRequest
6 голосов
/ 05 июня 2010

в Python, учитывая матрицу n x p, например, 4 x 4, как я могу вернуть матрицу 4 x 2, которая просто усредняет первые два столбца и последние два столбца для всех 4 строк матрицы?

например. Дано:

a = массив ([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])

возвращает матрицу, которая имеет среднее значение [:, 0] и a [:, 1] и среднее значение [:, 2] и a [:, 3]. Я хочу, чтобы это работало для произвольной матрицы n x p, предполагая, что число столбцов, которые я усредняю ​​по n, очевидно, делится на n.

позвольте мне уточнить: для каждой строки я хочу взять среднее значение первых двух столбцов, а затем среднее значение последних двух столбцов. Так было бы:

1 + 2/2, 3 + 4/2 <- строка 1 новой матрицы 5 + 6/2, 7 + 8/2 <- строка 2 новой матрицы и т. Д. </p>

, которая должна давать матрицу 4 на 2, а не 4 x 4.

спасибо.

Ответы [ 4 ]

5 голосов
/ 05 июня 2010

Как насчет математики? Вы можете определить матрицу M = [[0.5,0],[0.5,0],[0,0.5],[0,0.5]] так, чтобы A*M был тем, что вы хотите.

from numpy import array, matrix

A = array([[1, 2, 3, 4], 
           [5, 6, 7, 8], 
           [9, 10, 11, 12], 
           [13, 14, 15, 16]])
M = matrix([[0.5,0],
            [0.5,0],
            [0,0.5],
            [0,0.5]])
print A*M

Генерировать M тоже довольно просто, записи 1/n или ноль.

4 голосов
/ 09 июня 2010

изменить - получить среднее значение - изменить

>>> a.reshape(-1, a.shape[1]//2).mean(1).reshape(a.shape[0],-1)
array([[  1.5,   3.5],
       [  5.5,   7.5],
       [  9.5,  11.5],
       [ 13.5,  15.5]])

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

1 голос
/ 05 июня 2010

Вот способ сделать это. Вам нужно только изменить groupsize, чтобы он работал с другими размерами, как вы сказали, хотя я не до конца уверен, что вы хотите.

groupsize = 2
out = np.hstack([np.mean(x,axis=1,out=np.zeros((a.shape[0],1))) for x in np.hsplit(a,groupsize)])

выходы

array([[  1.5,   3.5],
   [  5.5,   7.5],
   [  9.5,  11.5],
   [ 13.5,  15.5]])

для out. Надеюсь, это даст вам некоторые идеи о том, как сделать именно то, что вы хотите сделать. Вы можете сделать groupsize зависимым, например, от размеров a.

1 голос
/ 05 июня 2010

Немного неясно, что должно произойти для матриц с n> 4, но этот код будет делать то, что вы хотите:

a = N.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], dtype=float)
avg = N.vstack((N.average(a[:,0:2], axis=1), N.average(a[:,2:4], axis=1))).T

Это дает avg =

array([[  1.5,   3.5],
       [  5.5,   7.5],
       [  9.5,  11.5],
       [ 13.5,  15.5]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...