[英]What is the fastest way to get the result of matrix < matrix in numpy?
假设我有一个维度矩阵M_1
(M,A)和一个维度矩阵M_2
(M,B)。 M_1 < M_2
的结果应该是维度矩阵(M,B,A),其中M1
中的每一行与M_2
的相应行的每个元素进行比较,并给出布尔向量(或1,0向量)每次比较。
例如,如果我有一个矩阵
M1 = [[1,2,3]
[3,4,5]]
M2 = [[1,2],
[3,4]]
result should be [[[False, False, False],
[True, False, False]],
[[False, False, False],
[True, False, False]]]
目前,我正在使用for循环,当我不得不多次重复这个操作(需要几个月)时,它非常慢。 希望有一种矢量化的方法来做到这一点。 如果没有,我还能做什么?
我看着M_1
是(500,3000000)而M_2
是( M_2
)并重复了大约10000次。
对于NumPy数组,使用None/np.newaxis
扩展dims,使第一个轴对齐,而第二个轴展开 ,以便以元素方式对它们进行比较。 最后,比较利用broadcasting
进行矢量化解决方案 -
M1[:,None,:] < M2[:,:,None]
样品运行 -
In [19]: M1
Out[19]:
array([[1, 2, 3],
[3, 4, 5]])
In [20]: M2
Out[20]:
array([[1, 2],
[3, 4]])
In [21]: M1[:,None,:] < M2[:,:,None]
Out[21]:
array([[[False, False, False],
[ True, False, False]],
[[False, False, False],
[ True, False, False]]])
对于列表作为输入,使用numpy.expand_dims
然后比较 -
In [42]: M1 = [[1,2,3],
...: [3,4,5]]
...:
...: M2 = [[1,2],
...: [3,4]]
In [43]: np.expand_dims(M1, axis=1) < np.expand_dims(M2, axis=2)
Out[43]:
array([[[False, False, False],
[ True, False, False]],
[[False, False, False],
[ True, False, False]]])
进一步提升
利用带有numexpr
模块multi-core
numexpr
为大数据提供进一步的推动力 -
In [44]: import numexpr as ne
In [52]: M1 = np.random.randint(0,9,(500, 30000))
In [53]: M2 = np.random.randint(0,9,(500, 500))
In [55]: %timeit M1[:,None,:] < M2[:,:,None]
1 loop, best of 3: 3.32 s per loop
In [56]: %timeit ne.evaluate('M1e<M2e',{'M1e':M1[:,None,:],'M2e':M2[:,:,None]})
1 loop, best of 3: 1.53 s per loop
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.