То, что индексирование zeros_4d[0,:,bool_array,:]
представляет собой смесь базовых c и продвинутых, с ломтиком в середине. Это специальный документированный случай, docs.scipy.org/doc/numpy/reference/…. Все размеры среза сдвинуты до конца, после логического индекса.
То есть с вашей 4d-формой и смешанным индексом:
In [213]: arr = np.ones((5,10,15,2),int)
In [214]: arr[0,:, [1,2,3],:].shape
Out[214]: (3, 10, 2)
Сначала мы можем обойти эту проблему выбор начального измерения:
In [216]: arr[0][:, [1,2,3],:].shape
Out[216]: (10, 3, 2)
In [217]: arr[0][:, [1,2,3],:] = 2
In [218]: arr
Out[218]:
array([[[[1, 1],
[2, 2],
[2, 2],
...,
[1, 1],
[1, 1],
[1, 1]],
...
Разделение индекса во время назначения может быть проблемой, если первый первый индекс создает копию, а не представление. Но здесь arr[0]
это вид, так что все в порядке.