#python #numpy
#python #numpy
Вопрос:
В Numpy вы можете подмножить определенные столбцы, указав список или целое число. Например:
a = np.ones((10, 5))
a[:,2] or a[:,[1,3,4]]
Но как сделать исключение? Где он возвращает все остальные столбцы, кроме 2 или [1,3,4] .
Причина в том, что я хочу сделать все остальные столбцы нулями, кроме одного или списка выбранных столбцов, например:
a[:, exclude(1)] *= 0
Я могу сгенерировать новый массив нулей с той же формой, а затем просто присвоить определенный столбец новой переменной. Но мне интересно, есть ли более эффективный способ
Спасибо
Комментарии:
1. Используйте
np.isin
для создания маски и используйте индексацию столбцов, как вы делаете.2. Я надеюсь, что что-то есть np.isnotin..
3. @J_yang Передать
invert=True
np.isin
(или иным образом свести на нет результат с~
помощью).
Ответ №1:
Один из способов — самостоятельно сгенерировать список индексов:
>>> 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.
Комментарии:
1. Или
a[:, np.isin(np.arange(a.shape[1]), [2, 1, 3, 4], invert=True)]
2. a[:, np.isin(np.arange(a.shape[1]), [2, 1, 3, 4], инвертировать=True)] отлично сработало. !
Ответ №2:
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]])