Numpy: выбор элементов на основе массива bool - PullRequest
1 голос
/ 11 апреля 2019

У меня есть массив и логический массив (как одна горячая кодировка)

a = np.arange(12).reshape(4,3)
b = np.array([
    [1,0,0],
    [0,1,0],
    [0,0,1],
    [0,0,1],
], dtype=bool)

print(a)
print(b)
# [[ 0  1  2]
#  [ 3  4  5]
#  [ 6  7  8]
#  [ 9 10 11]]
# [[ True False False]
#  [False  True False]
#  [False False  True]
#  [False False  True]]

И я бы хотел выбрать элементы, используя логический массив

print(a[:, [True, False, False]])
# array([[0],
#        [3],
#        [6],
#        [9]])

print(a[:, [False, True, False]])
# array([[ 1],
#        [ 4],
#        [ 7],
#        [10]])

Но этот выбор выбирается на основе одного и того же логического шаблона для всех строк. Я хотел бы выполнить это для каждой строки:

print(a[:, b])
# IndexError: too many indices for array

Что я должен вставить в ..., чтобы я получил:

print(a[:, ...])
# array([[0],
#        [4],
#        [8],
#        [11]])

РЕДАКТИРОВАТЬ: Это аналогично тому, что использовалось в печально известном CS231 курс:

dscores = a
num_examples = 4 
# They had 300
y = b
dscores[range(num_examples),y]
# equivalent to
# a{:,b]

РЕДАКТИРОВАТЬ 2: В примере CS231 , y является одномерным, а не горячим кодированием!

Они делали dscores[[rowIdx],[columnIdx]]

Ответы [ 2 ]

3 голосов
/ 11 апреля 2019

После фильтрации по b транслировать

a[b][:,None]
Out[168]: 
array([[ 0],
       [ 4],
       [ 8],
       [11]])

или

a[b,None]
Out[174]: 
array([[ 0],
       [ 4],
       [ 8],
       [11]])
0 голосов
/ 14 апреля 2019

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

In [275]: np.add.reduce(a*b, axis=1, keepdims=True)
Out[275]: 
array([[ 0],
       [ 4],
       [ 8],
       [11]])
...