В numpy.sum() есть параметр, называемый keepdims. Что оно делает?

В numpy.sum() есть параметр, называемый keepdims. Что оно делает?

Как вы можете видеть здесь в документации: http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html

numpy.sum(a, axis=None, dtype=None, out=None, keepdims=False)[source]
Sum of array elements over a given axis.

Parameters: 
...
keepdims : bool, optional
    If this is set to True, the axes which are reduced are left in the result as
    dimensions with size one. With this option, the result will broadcast
    correctly against the input array.
...

Ответы

Ответ 1

@Ney @hpaulj правильно, вам нужно поэкспериментировать, но я подозреваю, что вы не понимаете, что суммирование для некоторых массивов может происходить по осям. Соблюдайте следующее:

>>> a
array([[0, 0, 0],
       [0, 1, 0],
       [0, 2, 0],
       [1, 0, 0],
       [1, 1, 0]])
>>> np.sum(a, keepdims=True)
array([[6]])
>>> np.sum(a, keepdims=False)
6
>>> np.sum(a, axis=1, keepdims=True)
array([[0],
       [1],
       [2],
       [1],
       [2]])
>>> np.sum(a, axis=1, keepdims=False)
array([0, 1, 2, 1, 2])
>>> np.sum(a, axis=0, keepdims=True)
array([[2, 4, 0]])
>>> np.sum(a, axis=0, keepdims=False)
array([2, 4, 0])

Вы заметите, что если вы не укажете ось (keepdims = True два примера), то числовой результат будет таким же, но keepdims = True вернул 2D массив с номером 6, тогда как второе воплощение вернуло скаляр. Аналогично, при суммировании вдоль axis 1 (по строкам), 2D массив возвращается снова, когда keepdims = True. Последний пример, вдоль axis 0 (keepdims = True столбцы), показывает аналогичную характеристику... размеры сохраняются, когда keepdims = True.
Изучение осей и их свойств имеет решающее значение для полного понимания мощности NumPy при работе с многомерными данными.

Ответ 2

Пример, показывающий keepdims в действии при работе с массивами более высокой размерности. Давайте посмотрим, как меняется форма массива, когда мы делаем различные сокращения:

import numpy as np
a = np.random.rand(2,3,4)
a.shape
# => (2, 3, 4)

a.sum(axis=0).shape
# => (3, 4)
# Simple sum over the first dimension, we "lose" that dimension 
# because we did an aggregation (sum) over it

a.sum(axis=0, keepdims=True).shape
# => (1, 3, 4)
# Same sum over the first dimension, but instead of "loosing" that 
# dimension, it becomes 1.

a.sum(axis=(0,2)).shape
# => (3,)
# Here we "lose" two dimensions

a.sum(axis=(0,2), keepdims=True).shape
# => (1, 3, 1)
# Here the two dimensions become 1 respectively