我想知道在 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 循环快得多。但是,我想知道是否有更好的方法来做到这一点。
你要找的是in运营商。例如,1 in [1,2,3]返回True
给定您的v和值m作为 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))]
Run Code Online (Sandbox Code Playgroud)
结果是:
>>> [(v[i] in m[i]) for i in range(len(v))]
[False, False, True, True]
Run Code Online (Sandbox Code Playgroud)
Divakar 指出的另一个解决方案是使用
>>> (m==v[:,None]).any(1)
array([False, False, True, True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
但是,做一些粗略的时间检查:
>>> 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
Run Code Online (Sandbox Code Playgroud)
最初的解决方案似乎更快。
| 归档时间: |
|
| 查看次数: |
1785 次 |
| 最近记录: |