2016-08-15 4 views
2

Я хотел бы выполнить некоторые простые вычисления на блочной матрице (или, в более общем плане, на d-dim nd.array). Что-то вроде этого:Лучший способ получить среднее значение суммы матрицы в numpy?

Block matrix

В картине, заглавные буквы представляют 3 по 3 блока матрицу, и строчные буквы цифры (среднее или сумма блочных матриц).

В настоящее время я только знаю, как сделать это, используя для петли

import numpy as np 

test_matrix = np.arange(81).reshape(9,9) 
a = np.zeros((3,3)) 
for i in range(3): 
    for j in range(3): 
     a[k,i,j] = test_matrix[3*i:3*(i+1),3*j:3*(j+1)].mean() 
print a 

Но это становится медленным, если моя матрица становится больше или многомерными, например, следующие:

test_matrix = np.arange(81*2).reshape(2,9,9) 

a = np.zeros((2,3,3)) 
for k in range(2): 
    for i in range(3): 
     for j in range(3): 
      a[k,i,j] = test_matrix[k,3*i:3*(i+1),3*j:3*(j+1)].mean() 
print a 

Есть ли лучший способ выполнить такие задачи?

Большое спасибо!

+0

Попробуйте изменить форму (3,3,3,3) и взять сумму на 2 оси. – hpaulj

ответ

3
In [1952]: test=np.arange(81).reshape(9,9) 
In [1953]: res=np.zeros((3,3)) 
In [1954]: for i in range(3): 
     ...:  for j in range(3): 
     ...:   res[i,j]=test[3*i:3*(i+1),3*j:3*(j+1)].mean() 
In [1955]: res 
Out[1955]: 
array([[ 10., 13., 16.], 
     [ 37., 40., 43.], 
     [ 64., 67., 70.]]) 

С перекроить и сумма или среднее по отдельным осям:

In [1956]: test.reshape(3,3,3,3).mean(axis=(1,3)) 
Out[1956]: 
array([[ 10., 13., 16.], 
     [ 37., 40., 43.], 
     [ 64., 67., 70.]]) 

сумма/среднее позволяет нам указать 2 или более осей в то время, но это также может быть сделано с повторными приложениями одной оси ,

test.reshape(3,3,3,3).mean(3).mean(1) 

Для 3d массива, они работают

test.reshape(2,3,3,3,3).mean((2,4)) 
test.reshape(-1,3,3,3,3).mean((2,4)) 

-1 сохраняет первоначальную 1-й размер (или в случае 2d test, добавляет измерение размера 1).

+0

Спасибо, hpaulj! Я последовал вашим советам и делал следующее: 'test_matrix.reshape (2,3,3,9) .mean (2) .resape (2,9,3) .mean (2) .resape (2,3,3) '(для 3-го случая) – skippyho

Смежные вопросы