Если вы хотите что-то векторизовать, я бы предложил сделать это сравнение, трансформировав его в 3D и передав в третьем измерении.Затем для каждого среза проверьте каждую строку, чтобы увидеть, есть ли что-либо, что True
.Наконец, если мы видим, что для каждой строки каждый элемент равен True
, то это результат, который мы должны вернуть.
In [40]: matrix = np.array([['A', 'B', 'C'], ['A', 'B', np.nan], ['C', np.nan, np.nan] ])
In [41]: samples = ['C', 'A']
In [42]: samples = np.array(samples)
In [43]: mask = matrix[...,None] == samples[None,None]
In [44]: mask
Out[44]:
array([[[False, True],
[False, False],
[ True, False]],
[[False, True],
[False, False],
[False, False]],
[[ True, False],
[False, False],
[False, False]]])
In [45]: mask = np.any(mask, axis=1)
In [46]: mask
Out[46]:
array([[ True, True],
[False, True],
[ True, False]])
In [47]: mask = np.all(mask, axis=1)
In [48]: mask
Out[48]: array([ True, False, False])
Чтобы сделать это более коротко:
# Define data
matrix = np.array([['A', 'B', 'C'], ['A', 'B', np.nan], ['C', np.nan, np.nan] ])
samples = ['C', 'A']
# Solution
mask = np.all(np.any(matrix[...,None] == np.array(samples)[None,None], axis=1), axis=1)
Обратите внимание, что это, вероятно, не очень хорошо с большими разреженными матрицами ....