Вычитая среднее из значений массива с помощью Python [duplicate]

Если вам нужно быстро форматировать дату, используя обычный JavaScript, используйте getDate, getMonth + 1, getFullYear, getHours и getMinutes:

var d = new Date();

var datestring = d.getDate()  + "-" + (d.getMonth()+1) + "-" + d.getFullYear() + " " +
d.getHours() + ":" + d.getMinutes();

// 16-5-2015 9:50

Или, если вы нужно, чтобы он дополнялся нулями:

var datestring = ("0" + d.getDate()).slice(-2) + "-" + ("0"+(d.getMonth()+1)).slice(-2) + "-" +
    d.getFullYear() + " " + ("0" + d.getHours()).slice(-2) + ":" + ("0" + d.getMinutes()).slice(-2);

// 16-05-2015 09:50
7
задан DSM 15 August 2015 в 23:42
поделиться

2 ответа

Метод mean представляет собой операцию reduction , что означает, что он преобразует 1-й набор чисел в один номер. Когда вы применяете сокращение к n-мерному массиву вдоль оси, numpy сворачивает это измерение в уменьшенное значение, в результате чего (n-1) -мерный массив. В вашем случае, поскольку X имеет форму (5, 10), и вы выполнили редукцию вдоль оси 1, вы получите массив с формой (5):

In [8]: m = X.mean(axis=1)

In [9]: m.shape
Out[9]: (5,)

Когда вы попробуйте вычесть этот результат из X, вы пытаетесь вычесть массив с формой (5) из массива с формой (5, 10). Эти формы не совместимы для вещания . (Взгляните на описание трансляции в Руководстве пользователя .)

Для того, чтобы трансляция работала так, как вы хотите, результатом операции mean должен быть массив с формой (5, 1) (для совместимости с формой (5, 10)). В последних версиях numpy операции сокращения, включая mean, имеют аргумент, называемый keepdims, который сообщает функции не сворачивать уменьшенную размерность. Вместо этого сохраняется тривиальный размер с длиной 1:

In [10]: m = X.mean(axis=1, keepdims=True)

In [11]: m.shape
Out[11]: (5, 1)

В более старых версиях numpy вы можете использовать reshape для восстановления свернутого измерения:

In [12]: m = X.mean(axis=1).reshape(-1, 1)

In [13]: m.shape
Out[13]: (5, 1)

So , в зависимости от вашей версии numpy вы можете сделать это:

Y = X - X.mean(axis=1, keepdims=True)

или это:

Y = X - X.mean(axis=1).reshape(-1, 1)
21
ответ дан Warren Weckesser 28 August 2018 в 02:02
поделиться

Если вы ищете производительность, вы также можете использовать np.einsum , предположительно быстрее, чем на самом деле с помощью np.sum или np.mean. Таким образом, желаемый результат можно получить так же -

X - np.einsum('ij->i',X)[:,None]/X.shape[1]

Обратите внимание, что часть [:,None] похожа на keepdims, чтобы сохранить ее размеры так же, как у входного массива.

Тест времени выполнения

1) Сравнение только вычисления mean -

In [47]: X = np.random.rand(500, 1000)

In [48]: %timeit X.mean(axis=1, keepdims=True)
1000 loops, best of 3: 1.5 ms per loop

In [49]: %timeit X.mean(axis=1).reshape(-1, 1)
1000 loops, best of 3: 1.52 ms per loop

In [50]: %timeit np.einsum('ij->i',X)[:,None]/X.shape[1]
1000 loops, best of 3: 832 µs per loop

2) Сравнение всего расчета -

In [52]: X = np.random.rand(500, 1000)

In [53]: %timeit X - X.mean(axis=1, keepdims=True)
100 loops, best of 3: 6.56 ms per loop

In [54]: %timeit X - X.mean(axis=1).reshape(-1, 1)
100 loops, best of 3: 6.54 ms per loop

In [55]: %timeit X - np.einsum('ij->i',X)[:,None]/X.shape[1]
100 loops, best of 3: 6.18 ms per loop
1
ответ дан Divakar 28 August 2018 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: