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