Если вам нужно быстро форматировать дату, используя обычный 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
Метод 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)
Если вы ищете производительность, вы также можете использовать 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