Если вы подаете в этом нарезанной 2D массива A[:,3:]
к np.in1d
, было бы расплющить его в 1D массив и сравнить с B
вхождений и, таким образом, создать 1D маску, которая может быть преобразована и используется для булевой индексации в этом нарезанной массив для установки TRUE
элементов на zeros
. Реализация один лайнер будет выглядеть примерно так -
A[:,3:][np.in1d(A[:,3:],B).reshape(A.shape[0],-1)] = 0
Пример запуска -
In [37]: A
Out[37]:
array([[ 1, 1, 10, 101, 102, 103, 0, 0],
[ 2, 2, 10, 102, 108, 0, 0, 0],
[ 3, 3, 11, 101, 102, 106, 107, 108]])
In [38]: np.in1d(A[:,3:],B) # Flattened mask
Out[38]:
array([ True, False, False, False, False, False, True, False, False,
False, True, False, True, False, True], dtype=bool)
In [39]: np.in1d(A[:,3:],B).reshape(A.shape[0],-1) # Reshaped mask
Out[39]:
array([[ True, False, False, False, False],
[False, True, False, False, False],
[ True, False, True, False, True]], dtype=bool)
In [40]: A[:,3:][np.in1d(A[:,3:],B).reshape(A.shape[0],-1)] = 0 # Final code
In [41]: A
Out[41]:
array([[ 1, 1, 10, 0, 102, 103, 0, 0],
[ 2, 2, 10, 102, 0, 0, 0, 0],
[ 3, 3, 11, 0, 102, 0, 107, 0]])
Чтобы сделать вещи проще, вы можете создать вид уплощенной A
и использовать маску 1D полученный от np.in1d
, чтобы иметь более элегантное решение. Для решения, которое изменяет только нарезанные A[:,3:]
, вы можете использовать .flat
, а затем индекс, как так -
A[:,3:].flat[np.in1d(A[:,3:],B)] = 0
Для случая, когда вы хотели бы установить соответствие них по всей A
, вы можете использовать .ravel()
-
A.ravel()[np.in1d(A,B)] = 0
Я знаю .ravel()
вид и из документации, кажется .flat
не создает копию либо, поэтому они должны быть дешевой.
Это здорово, не понимал, что я могу сделать это с индексированием. Смогу ли я использовать один и тот же подход, если бы я не питался нарезанным массивом, а вместо этого был полный массив 'A'? – user3357979
@ пользователь3357979 Yup! Такой же подход должен работать и там. Итак, что-то вроде 'A [np.in1d (A, B) .reshape (A.shape [0], - 1)] = 0'. – Divakar
Просто предупреждение, это изменит 'A' на месте, не даст вам массив' result': вы потеряете оригинал 'A', в случае, если это имеет значение. – askewchan