【问题标题】:Row wise contain in numpy [duplicate]行明智地包含在 numpy [重复]
【发布时间】:2018-07-07 10:14:06
【问题描述】:

我想知道在 python numpy 中检查行明智包含的最佳方法是什么?

假设我们有一个向量 V = [1, 2, 3, 4] 和一个矩阵 M = [[2, 3, 4], [3, 5, 6], [4, 1, 3], [ 5, 4, 2]](M中的行数等于V的长度)。执行按行包含后,我应该得到 (False, False, True, True) 因为 1 不在 [2, 3, 4] 中,2 不在 [3, 5, 6] 中,3 在 [4, 1 , 3] 和 4 在 [5, 4, 2] 中

在 python numpy 中执行此操作的最佳方法是什么?

实际上,我不想使用 for 循环。这显然是可行的,但不是最好的方法。我自己想出了这个想法来做减法,然后计算结果中的零个数,这比使用 for 循环要快得多。但是,我想知道是否有更好的方法。

【问题讨论】:

  • 我试过 numpy.isin,但它不起作用,因为它检查了第一个数组的所有元素。
  • 为什么不V[0] in M[0]
  • 显然,我可以使用 for 循环。我想要一个快速的答案(我的意思是在矢量化操作中执行)
  • 对于数组:(M==V[:,None]).any(1).

标签: numpy


【解决方案1】:

您正在寻找的是in 运算符。例如1 in [1,2,3] 返回True 因此,将您的 vm 值作为 numpy 数组,如下所示:

import numpy as np
v = np.array([1,2,3,4])
m = np.array([np.array([2,3,4]), np.array([3,5,6]), np.array([4,1,3]), np.array([5,4,2])])    
# Checking row wise contain
result = [(v[i] in m[i]) for i in range(len(v))]

结果是:

>>> [(v[i] in m[i]) for i in range(len(v))]
[False, False, True, True]

Divakar 指出的另一个解决方案是使用

>>> (m==v[:,None]).any(1)
array([False, False,  True,  True], dtype=bool)

但是,做一些粗略的时间检查:

>>> start_time=time.time(); (m==v[:,None]).any(1); print(time.time()-start_time)
array([False, False,  True,  True], dtype=bool)
0.000586032867432
>>> start_time=time.time(); [(v[i] in m[i]) for i in range(len(v))]; print(time.time()-start_time)
[False, False, True, True]
7.20024108887e-05

最初的解决方案似乎更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2018-05-13
    • 2021-03-31
    • 1970-01-01
    相关资源
    最近更新 更多