Подтвердить что ты не робот

Выбор элементов массива numpy с помощью массива boolean mask

У меня есть массив логических масок a длины n:

a = np.array([True, True, True, False, False])

У меня есть 2d массив с n столбцами:

b = np.array([[1,2,3,4,5], [1,2,3,4,5]])

Я хочу новый массив, который содержит только "True" -values, например

c = ([[1,2,3], [1,2,3]])

c = a * b не работает, потому что он содержит также "0" для ложных столбцов, что я не хочу

c = np.delete(b, a, 1) does not work

Какие-либо предложения?

4b9b3361

Ответ 1

Вероятно, вы хотите что-то вроде этого:

>>> a = np.array([True, True, True, False, False])
>>> b = np.array([[1,2,3,4,5], [1,2,3,4,5]])
>>> b[:,a]
array([[1, 2, 3],
       [1, 2, 3]])

Обратите внимание, что для того, чтобы этот тип индексирования работал, он должен быть ndarray, как вы использовали, а не list, или интерпретирует False и True как 0 и 1 и выделите эти столбцы:

>>> b[:,[True, True, True, False, False]]   
array([[2, 2, 2, 1, 1],
       [2, 2, 2, 1, 1]])

Ответ 2

Вы можете использовать модуль numpy.ma и использовать функцию np.ma.masked_array для этого.

>>> x = np.array([1, 2, 3, -1, 5])                                                
>>> mx = ma.masked_array(x, mask=[0, 0, 0, 1, 0])
masked_array(data=[1, 2, 3, --, 5], mask=[False, False,  False, True, False], fill_value=999999)

Ответ 3

Надеюсь, я еще не поздно! Вот ваш массив:

X = np.array([[1, 2, 3, 4, 5], 
              [1, 2, 3, 4, 5]])

Давайте создадим массив нулей той же формы, что и X:

mask = np.zeros_like(X)
# array([[0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0]])

Затем укажите столбцы, которые вы хотите скрыть или скрыть с помощью 1. В этом случае мы хотим, чтобы последние 2 столбца были замаскированы.

mask[:, -2:] = 1
# array([[0, 0, 0, 1, 1],
#        [0, 0, 0, 1, 1]])

Создать замаскированный массив:

X_masked = np.ma.masked_array(X, mask)
# masked_array(data=[[1, 2, 3, --, --],
#                    [1, 2, 3, --, --]],
#              mask=[[False, False, False,  True,  True],
#                    [False, False, False,  True,  True]],
#              fill_value=999999)

Затем мы можем сделать с TG46 все, что захотим, например, взять сумму каждого столбца (вдоль axis=0):

np.sum(X_masked, axis=0)
# masked_array(data=[2, 4, 6, --, --],
#              mask=[False, False],
#              fill_value=1e+20)

Самое замечательное в этом то, что X_masked - это просто представление X, а не его копия.

X_masked.base is X
# True