Ваш пример --- применение скалярной или 0D --- логической маски к массиву 1D дает
print(a[True])
# [[0 1 2 3 4]]
print(a[False])
# []
Для ясности, особенно во втором (False
) случае, давайте запросимформы
print(a[True].shape)
# (1, 5)
print(a[False].shape)
# (0, 5)
Теперь это немного озадачивает на первый взгляд.Почему дополнительное измерение?
Давайте начнем с менее острого случая и выясним, почему это логичное поведение:
x = np.arange(6).reshape(3,2)
m2 = np.array([[True,False],[True,True],[False,True]])
m1 = np.array([True,False,True])
m0 = np.array(True)
Мы создали двумерный массив и сопоставили 2D, 1D и 0Dмаски.
Маскирование с помощью 2D-маски дает 1D-результат
x[m2]
# array([0, 2, 3, 5])
Маскирование с помощью 1D-маски выделяет целые строки и, следовательно, дает 2D-результат
x[m1]
# array([[0, 1],
# [4, 5]])
МыМожно также проверить в более высоких измерениях, что удаление измерения из маски добавляет единицу к результату.
Поэтому логично, что маскируя с 0D, мы должны получить действительно одно измерение больше, чем мы начали.2D маска выбирает отдельные точки (0D -> список из них: 1D), 1D маска выбирает целые строки (1D -> список из них: 2D);следовательно, маска 0D должна выделять целые листы (2D -> список из них: 3D);так как базовый массив является 2D, лист является целым.
x[m0]
# array([[[0, 1],
# [2, 3],
# [4, 5]]])
x[m0].ndim
# 3
В общем:
x[m2].ndim == x.ndim - m2.ndim + 1
# True
x[m1].ndim == x.ndim - m1.ndim + 1
# True
x[m0].ndim == x.ndim - m0.ndim + 1
# True