Если мы посмотрим на это так:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [True, True, True, True, True, False, False, False, False, True]
c = [1, 1, 1, 1, 1, 0, 0, 0, 0, -1]
npa = np.asarray(a)
npb = np.asarray(b)
npc = np.asarray(c)
print(npa[b]) # [0 1 2 3 4 9]
print(npa[npb]) # [0 1 2 3 4 9]
print(npa[c]) # [1 1 1 1 1 0 0 0 0 0 9]
print(npa[npc]) # [1 1 1 1 1 0 0 0 0 0 9]
Мы можем видеть, что b
и npb
являются логическими масками, которые указывают, какие индексы выбрать, а c
и npc
актуальны индексы, которые должны быть взяты из данного массива.
Это упоминается в документах :
Булевы массивы, используемые в качестве индексов, обрабатываются совершенно иначе, чем индекс массивы ... В отличие от целочисленных индексных массивов, в логическом случае результатом является одномерный массив, содержащий все элементы в индексированном массиве, соответствующие всем истинным элементам в логическом массиве.