в 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.
спасибо.
Вот способ сделать это. Вам нужно только изменить 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
.
Как насчет использования математики? Вы можете определить матрицу 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
или ноль.
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 не делает копию.
Немного непонятно, что должно происходить с матрицами с 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]])