选择包含所有给定值的numpy数组的行

时间:2019-06-02 22:49:55

标签: python numpy vectorization

我有一个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时才能有效地获得掩码?

我专注于高效,因为它的矩阵稀疏而庞大。

先谢谢您的估计。

4 个答案:

答案 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]

谢谢您的帮助。