Для цикла для получения суммы и среднего значения в массиве np 3d

#numpy #for-loop #list-comprehension

#numpy #for-цикл #список-понимание

Вопрос:

У меня есть следующий массив

 arr = np.array([[[1, 2, 3], [4, 5, 6]], 
                [[7, 8, 9], [10, 11, 12]]])
 

Я хочу просмотреть каждый элемент и суммировать по оси 0, поэтому я делаю:

 lst = []
for x in arr:
    for y in np.sum(x,axis=0):
        lst.append(y)
 

где сейчас lst находится

 [5, 7, 9, 17, 19, 21]
 

Однако я хочу, чтобы результат был в следующем виде:

 [[5, 7, 9], [17, 19, 21]]
 

затем взять среднее значение его оси 0, а именно (5 17) / 2 и так далее. Конечный результат должен выглядеть следующим образом

 [11., 13., 15.]
 

Интересно, как я могу это сделать? Возможно ли записать всю эту операцию в компактной форме в виде понимания списка?

Обновление: чтобы получить конечный результат, я могу сделать:

 np.mean(np.reshape(lst, (len(arr),-1)),axis=0) 
 

Тем не менее, я уверен, что есть питонический способ сделать это

Ответ №1:

 In [5]: arr = np.array([[[1, 2, 3], [4, 5, 6]],
   ...:                 [[7, 8, 9], [10, 11, 12]]])
In [7]: arr
Out[7]: 
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
 

for Итерации по 1-му измерению, как если бы это был список массивов:

 In [8]: for x in arr:print(x)
[[1 2 3]
 [4 5 6]]
[[ 7  8  9]
 [10 11 12]]
 

list(arr) также создает список (но он медленнее, чем `arr.tolist()).

Одним из распространенных способов итерации по другим измерениям является использование индекса:

 In [10]: for i in range(2):print(arr[:,i])
[[1 2 3]
 [7 8 9]]
[[ 4  5  6]
 [10 11 12]]
 

Вы также можете транспонировать массив, поместив сначала нужную ось.

Но вам не нужно повторять

 In [13]: arr.sum(axis=1)
Out[13]: 
array([[ 5,  7,  9],
       [17, 19, 21]])
In [14]: arr.sum(axis=1).mean(axis=0)
Out[14]: array([11., 13., 15.])