Как подмножить массив Numpy с исключением

В Numpy вы можете подмножить определенные столбцы, указав список или целое число. Например:

a = np.ones((10, 5))

a[:,2] or a[:,[1,3,4]]

Но как сделать исключение? Где он возвращает все остальные столбцы, кроме 2 или [1,3,4].

Причина в том, что я хочу сделать все остальные столбцы нулями, кроме одного или списка выбранных столбцов, например:

a[:, exclude(1)] *= 0

Я могу создать новый массив нулей той же формы, а затем просто назначить конкретный столбец новой переменной. Но мне интересно, есть ли более эффективный способ

Спасибо

Используйте np.isin для создания маски и используйте индексацию столбцов, как вы это делаете.

Divakar 08.04.2019 14:57

Я надеюсь, что что-то есть np.isnotin..

J_yang 08.04.2019 14:59

@J_yang Передать invert=True в np.isin (или иным образом отменить результат с помощью ~).

jdehesa 08.04.2019 15:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
3
1 660
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Один из способов — создать список индексов самостоятельно:

>>> a[:,list(i for i in range(a.shape[1]) if i not in set((2,1,3,4)))]
array([[ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.],
       [ 0.]])

или исключить один столбец (после вашего редактирования):

>>> a[:,list(i for i in range(a.shape[1]) if i != 1)]*= 0

или если вы используете это часто и хотите использовать функцию (которая не будет называться except, поскольку это ключевое слово Python:

def exclude(size,*args):
    return [i for i in range(size) if i not in set(args)] #Supports multiple exclusion

а сейчас

a[:,exclude(a.shape[1],1)]

работает.

@jdehesa упоминает о Numpy 1.13, который вы можете использовать

a[:, np.isin(np.arange(a.shape[1]), [2, 1, 3, 4], invert=True)]

а также для чего-то внутри самого Numpy.

Или a[:, np.isin(np.arange(a.shape[1]), [2, 1, 3, 4], invert=True)]

jdehesa 08.04.2019 14:59

a[:, np.isin(np.arange(a.shape[1]), [2, 1, 3, 4], invert=True)] отлично работал. !

J_yang 08.04.2019 15:11

np.delete использует логическую маску для удаления/выбора элементов.

In [27]: arr = np.arange(24).reshape(3,8)                                       

In [29]: mask = np.ones(arr.shape[1], bool)                                     
In [30]: mask[[1,3,4]] = False                                                  
In [31]: mask                                                                   
Out[31]: array([ True, False,  True, False, False,  True,  True,  True])

In [32]: arr[:,mask]                                                            
Out[32]: 
array([[ 0,  2,  5,  6,  7],
       [ 8, 10, 13, 14, 15],
       [16, 18, 21, 22, 23]])
In [33]: arr[:,mask] *= 0                                                       
In [34]: arr                                                                    
Out[34]: 
array([[ 0,  1,  0,  3,  4,  0,  0,  0],
       [ 0,  9,  0, 11, 12,  0,  0,  0],
       [ 0, 17,  0, 19, 20,  0,  0,  0]])

Легко перевернуть, например, маску, чтобы включить:

In [35]: arr[:,~mask]                                                           
Out[35]: 
array([[ 1,  3,  4],
       [ 9, 11, 12],
       [17, 19, 20]])

Другие вопросы по теме