усреднение матрицы эффективно

в 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] и [: 1] и среднее число [: 2] и [: 3]. Я хочу, чтобы это работало на произвольную матрицу предположения n x p, что число столбцов, которые я насчитываю n, является, очевидно, равномерно делимым n.

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

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

который должен привести к матрице 4 на 2, а не 4 x 4.

спасибо.

6
задан 4 June 2010 в 23:20
поделиться

4 ответа

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

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]])

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

1
ответ дан 9 December 2019 в 22:29
поделиться

Как насчет использования математики? Вы можете определить матрицу M = [[0.5,0],[0.5,0],[0,0.5],[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 или ноль.

5
ответ дан 9 December 2019 в 22:29
поделиться

reshape - поймите меня правильно - reshape

>>> 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]])

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

4
ответ дан 9 December 2019 в 22:29
поделиться

Немного непонятно, что должно происходить с матрицами с 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]])
1
ответ дан 9 December 2019 в 22:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: