簡體   English   中英

在numpy中獲得矩陣<矩陣的結果的最快方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM