2015-02-20 2 views
0

У меня есть 3D-массив так:Вычислить среднее из вспомогательных массивов в пределах большей 3D массива в Python

a = ([[[25, 4, 54], [58, 14, 27], [35, 40, 62], [53, 72, 86], [87, 4, 51], [89, 34, 22]], 
     [[61, 99, 89], [52, 93, 18], [ 0, 38, 12], [99, 10, 98], [79, 91, 75], [31, 59, 3]], 
     [[22, 9, 63], [37, 26, 3], [54, 40, 39], [36, 87, 44], [81, 10, 7], [75, 29, 20]], 
     [[55, 30, 44], [21, 36, 98], [56, 52, 78], [80, 76, 32], [72, 26, 17], [15, 81, 37]], 
     [[73, 37, 28], [30, 44, 75], [66, 59, 61], [34, 57, 56], [13, 51, 73], [20, 51, 94]], 
     [[86, 38, 69], [85, 74, 91], [25, 90, 58], [50, 12, 79], [24, 96, 28], [73, 2, 17]]]) 

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

([[[49, 52, 47], [47, 40, 64], 

... и так далее ...

Я попытался с помощью нарезку с шагом следуют средней функции как

a[::2].mean() 

, но он не возвращает результат, который я ожидаю.

Пока что я могу получить это среднее столбца или строки с помощью

numpy.mean(a, axis=0 or 1) 

, но это не полезно для меня, потому что она возвращает весь столбец или строки означают, а не средство 4 элементов через матрицу.

Каков наилучший способ для этого?

+0

Возможно обеспечить меньший входной и точный ожидаемый результат как объяснение не имеет смысла для меня. –

+0

Откуда берутся [49, 52, 47]? –

+0

Извините ... [49,52,47] исходит из вычисленного среднего из первых двух элементов строки и первых двух элементов столбца. ([[25, 4, 54], [58, 14, 27], [[61, 99, 89], [52, 93, 18]), но проще, если у меня есть такая матрица, как: g = [[[1,2,3], [1,2,3], [1,2,3], [1,2,3]], [[4,5,6], [4,5,6 ], [4,5,6], [4,5,6]]] Я хотел бы рассчитать среднее значение [[[1,2,3], [1,2,3]], [[4, 5,6], [4,5,6]] и снова среднее значение [[1,2,3], [1,2,3]], [[4,5,6], [4,5, 6]]. Ожидаемым результатом будет: [[[2.5, 3.5, 4.5]], [[2.5, 3.5, 4.5]]]. Но так как я хочу целые числа, это будет: [[2, 3, 4] [2, 3, 4]]. – Fern

ответ

0

Я предполагаю, что вы хотите вычислить среднее значение записей (0,0), (0,1), (1,0), (1,1), затем (2,2), (2 , 3), (3,2), (3,3) и т. Д.

Вы выбираете каждый второй столбец и строку четыре раза, начиная с индексов (0,0), (0,1), (1,0) и (1,1) соответственно. Затем разделить на 4 и округлить результат:

np.round((a[::2,::2] + a[1::2,::2] + a[::2,1::2] + a[1::2,1::2])/4.0) 

Это дает

array([[[ 49., 52., 47.], 
     [ 47., 40., 64.], 
     [ 72., 47., 38.]], 

     [[ 34., 25., 52.], 
     [ 56., 64., 48.], 
     [ 61., 36., 20.]], 

     [[ 68., 48., 66.], 
     [ 44., 54., 64.], 
     [ 32., 50., 53.]]]) 
+0

Карстен, ваш ответ прекрасен! Тем не менее, я столкнулся с проблемой из-за характера моей матрицы (RGB). Проблема возникает, когда сумма значений выше 255, что приводит к меньшему числу. Например, x = ([[[255, 8, 54], [165, 69, 21], [63, 166, 49], [32, 170, 118], [39, 90,171], [80,60,220]], [[255, 8, 54], [165, 69, 21], [63,166,49], [32, 170, 118], [39,90,171], [80,60,220]]], dtype = uint8) возвращается как: ([[[18., 38., 38.], [48, 40, 20.], [60, 11., 4.]]]), когда это должно быть: ([[[210,38,38], [48,168,84], [59,75,196]]]). Должен ли я изменить тип матрицы, прежде чем применять предложенную вами функцию? – Fern

+0

@Fern Точно. Тип данных вашего массива - 'uint8' (байт) и поэтому не может содержать значения больше 255. Используйте [что-то вроде' b = a.astype (int) '] (http://docs.scipy.org/doc /numpy/reference/generated/numpy.ndarray.astype.html) сначала для преобразования массива, тогда мое решение будет работать правильно. – Carsten

+0

Да, он отлично работал @ Карстен. Спасибо! К несчастью, я не могу поддержать ваши ответы, потому что я новичок в списке. – Fern