python - 在numpy中获得matrix < matrix结果的最快方法是什么?

标签 python performance numpy vectorization

假设我有一个矩阵 M_1维度 (M, A) 和矩阵 M_2尺寸(M,B)。 M_1 < M_2的结果应该是维数 (M, B, A) 的矩阵,其中 M1 中的每一行正在与 M_2 对应行的每个元素进行比较并为每次比较给出一个 bool 向量(或 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为 (500, 500) 并重复约 10000 次。

最佳答案

对于 NumPy 数组,使用 None/np.newaxis 扩展 dims,这样第一个轴对齐,而第二个轴展开,这样可以在一个元素时尚。最后做比较利用 broadcasting对于矢量化解决方案 -

M1[:,None,:] < M2[:,:,None]

sample 运行-

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]]])

进一步提升

利用杠杆进一步提升 multi-core with numexpr module对于大数据 -

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

关于python - 在numpy中获得matrix < matrix结果的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50943043/

相关文章:

python - R 或 Python - 循环测试数据 - 接下来 24 小时的预测验证(每天 96 个值)

asp.net-mvc - 在 ASP.NET(包括 MVC)中使用 session 变量的替代方法

php: session 与数据库

python - 如何在 2D 数组上获得与 numpy.where 相同的结果,而不从同一行获取 2 个索引

python - 在 Python 中读取 .mat 文件。但是数据的形状发生了变化

python - 将字符串拆分为数据框 pandas

php - 在 PHP 中将 tiff 转换为 gif

python - 如何在 matplotlib 中制作热图?

javascript - 查找函数还是 for in 循环?

python-2.7 - 获取 Pandas 数据框每一列中最后一个非 NaN 值的行索引