我有一个np.array:
matrix = np.array([['A', 'B', 'C'], ['A', 'B', np.nan], ['C', np.nan, np.nan] ])
并且我想有效地选择包含给定值的所有行
samples = ['C', 'A']
但是当我做的时候:
mask = np.isin(matrix, samples)
我明白了
array([[ True, False, True],
[ True, False, False],
[ True, False, False]])
如何仅在包含两个值的行中将True设置为True时才能有效地获得掩码?
我专注于高效,因为它的矩阵稀疏而庞大。
先谢谢您的估计。
答案 0 :(得分:0)
我的第一个方法是
[np.isin(samples, row).all() for row in matrix]
# [True, False, False]
(但老实说,我无法透露任何有关效率或性能的信息...)
答案 1 :(得分:0)
如果您想对向量进行矢量化处理,建议将其转换为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)
请注意,这可能不适用于大型稀疏矩阵。
答案 2 :(得分:0)
以下是伪代码可能会帮助您:
idxRows = []
for idx, i in enumerate(mask):
if True in i:
idxRows.append(idx)
这将为您提供包含所述样本的所有行的索引。
答案 3 :(得分:0)
我终于使用了:
#Filter
test_elements = ['A', 'B']
mask = np.isin(matrix, test_elements)
vec_mask = np.isin(mask.sum(axis=1), [len(test_elements)])
ids = np.where(vec_mask)
existence = matrix[ids]
谢谢您的帮助。