Вещание имеет два этапа:
- развернуть размеры слева, чтобы соответствовать
- развернуть все размеры размера 1, чтобы соответствовать
С размером (12,) массив, первый шаг может произвести (1,1,12), но не (12,1,1).Второй шаг может затем расшириться до (2,2,12).Но вы хотите (12,2,2).
Таким образом, вы должны явно добавить конечные измерения
In [773]: np.broadcast_to(np.arange(12)[:,None,None], (12,2,2)).shape
Out[773]: (12, 2, 2)
In [775]: np.broadcast_to(np.arange(3)[:,None,None], (3,2,2))
Out[775]:
array([[[0, 0],
[0, 0]],
[[1, 1],
[1, 1]],
[[2, 2],
[2, 2]]])
Итак, по этим правилам трансляция в (2,2,12) работает,и transpose может изменить это значение на (12,2,2)
Вещание на (12,12,12) эквивалентно расширению (1,1,12).arange
- это последнее измерение, а не первое.Мы не хотим нарезать это последнее измерение
In [777]: np.broadcast_to(np.arange(3),(3,3,3))[:,:2,:2]
Out[777]:
array([[[0, 1],
[0, 1]],
[[0, 1],
[0, 1]],
[[0, 1],
[0, 1]]])