Индекс истинного и ложного числового массива - PullRequest
3 голосов
/ 27 сентября 2019

Код :

import numpy as np    
a = np.arange(5)   
print(a[True])    
print(a[False])

Результат :

[[0 1 2 3 4]]
[]

Для приведенного выше кода, когда я передаю True в индекс индексаNumPy массив возвращает полный массив, а для False пустой массив.Что происходит в фоновом режиме?

Ответы [ 3 ]

3 голосов
/ 27 сентября 2019

Ваш пример --- применение скалярной или 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
0 голосов
/ 27 сентября 2019

как ответил Akash_Kumar, вы в основном применяете логическую маску;a[True] означает «a везде», в отличие от a[False] означает «a нигде».

То, что вы могли бы захотеть сделать , это

mask = a.astype(np.bool_) # evaluates to False where a is zero
# mask
# array([False,  True,  True,  True,  True])

print(a[mask])
# a where a is not zero:
# array([1, 2, 3, 4])

# ...mask would in this case be similar to
print(a.nonzero())
# indices where a is not zero:
# (array([1, 2, 3, 4], dtype=int64),)
0 голосов
/ 27 сентября 2019

a будет вашим пустым массивом и, т. Е. [0,1,2,3,4] вы предполагаете поставить условие на индекс, если условие выполнено, тогда он вернет этот элемент, если нет, то отбросит этот элемент.здесь вы ставите True, что означает, что каждый элемент удовлетворяет этому условию, которое истинно в каждом случае, если False, то не соответствует элементу.отметьте этот раздел

Булевы или индексные массивы «маски»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...