Первый Небольшая заметка о вещании в NumPy.Когда я переключился с matlab на python, вещание меня немного смутило, но как только я нашел время, чтобы понять это, я понял, насколько это полезно.Чтобы узнать больше о вещании, взгляните на http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html,
Поскольку вещание массива (m,) в numpy (то, что вы называете вектором) по существу эквивалентно массиву (1, m) или(1, 1, м) массив и так далее.Кажется, вы хотите, чтобы массив (m,) вел себя как массив (m, 1).Я полагаю, что это иногда случается, особенно в модуле linalg, но если вы собираетесь это сделать, вы должны знать, что вы нарушаете соглашение о numpy.
С этим предупреждением есть код:
import scipy as sp
def my_mean(x):
if x.ndim == 1:
x = x[:, sp.newaxis]
m = sp.empty(x.shape)
m[:] = x.mean(0)
return sp.squeeze(m)
и пример:
In [6]: x = sp.arange(30).reshape(5,6)
In [7]: x
Out[7]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29]])
In [8]: my_mean(x)
Out[8]:
array([[ 12., 13., 14., 15., 16., 17.],
[ 12., 13., 14., 15., 16., 17.],
[ 12., 13., 14., 15., 16., 17.],
[ 12., 13., 14., 15., 16., 17.],
[ 12., 13., 14., 15., 16., 17.]])
In [9]: my_mean(x[0])
Out[9]: array([ 2.5, 2.5, 2.5, 2.5, 2.5, 2.5])
Это быстрее, чем при использовании tile
, время ниже:
In [1]: import scipy as sp
In [2]: x = sp.arange(30).reshape(5,6)
In [3]: m = x.mean(0)
In [5]: timeit m_2d = sp.empty(x.shape); m_2d[:] = m
100000 loops, best of 3: 2.58 us per loop
In [6]: timeit m_2d = sp.tile(m, (len(x), 1))
100000 loops, best of 3: 13.3 us per loop