При обращении к массиву numpy со списком логических индексов список выводится вместо - PullRequest
0 голосов
/ 10 марта 2020

При использовании логического индексирования для массивов numpy происходит различное поведение в зависимости от того, были ли индексы логическими или целыми (1/0). В этом ответе указано, что с Python 3.x

True и False являются ключевыми словами и всегда будут равны 1 и 0.

Может кто-нибудь объяснить, что вызывает такое поведение?

MWE для репликации (Python 3.7.3, Numpy 1.16.3):

import numpy as np

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [True, True, True, True, True, False, False, False, False, False]
c = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0]

npa = np.asarray(a)
npb = np.asarray(b)
npc = np.asarray(c)

print(npa[b])   # [0 1 2 3 4]
print(npa[npb]) # [0 1 2 3 4]
print(npa[c])   # [1 1 1 1 1 0 0 0 0 0]
print(npa[npc]) # [1 1 1 1 1 0 0 0 0 0]

1 Ответ

2 голосов
/ 10 марта 2020

Если мы посмотрим на это так:

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 актуальны индексы, которые должны быть взяты из данного массива.

Это упоминается в документах :

Булевы массивы, используемые в качестве индексов, обрабатываются совершенно иначе, чем индекс массивы ... В отличие от целочисленных индексных массивов, в логическом случае результатом является одномерный массив, содержащий все элементы в индексированном массиве, соответствующие всем истинным элементам в логическом массиве.

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