簡體   English   中英

加快矩陣中每個x,y點的角度計算

[英]Speed up angle calculation for each x,y point in a matrix

我有一個3-d Numpy數組flow ,如下所示:

flow = np.random.uniform(low=-1.0, high=1.0, size=(720,1280,2))
# Suppose flow[0] are x-coordinates. flow[1] are y-coordinates.

需要計算每個x,y點的角度。 這是我的實現方式:

def calcAngle(a):
    assert(len(a) == 2)
    (x, y) = a
    # angle_deg = 0
    angle_deg = np.angle(x + y * 1j, deg=True)
    return angle_deg

fangle = np.apply_along_axis(calcAngle, axis=2, arr=flow) 
# The above statement takes 14.0389318466 to execute

在Macbook Pro上執行每個點的角度計算需要14.0389318466 seconds

有沒有一種方法可以加快速度,可能是通過使用某些矩陣運算,而不是一次處理每個像素。

numpy.angle支持矢量化操作。 因此,只需將第一列和第二列的切片輸入其中以得到最終輸出,就像這樣-

fangle = np.angle(flow[...,0] + flow[...,1] * 1j, deg=True)

驗證-

In [9]: flow = np.random.uniform(low=-1.0, high=1.0, size=(720,1280,2))

In [17]: out1 = np.apply_along_axis(calcAngle, axis=2, arr=flow)

In [18]: out2 = np.angle(flow[...,0] + flow[...,1] * 1j, deg=True)

In [19]: np.allclose(out1, out2)
Out[19]: True

運行時測試-

In [10]: %timeit np.apply_along_axis(calcAngle, axis=2, arr=flow)
1 loop, best of 3: 8.27 s per loop

In [11]: %timeit np.angle(flow[...,0] + flow[...,1] * 1j, deg=True)
10 loops, best of 3: 47.6 ms per loop

In [12]: 8270/47.6
Out[12]: 173.73949579831933

173x+加速!

您可以使用numpy.arctan2()獲取以弧度為單位的角度,然后使用numpy.rad2deg()轉換為度數:

fangle = np.rad2deg(np.arctan2(flow[:,:,1], flow[:,:,0]))

在我的計算機上,這比Divakar的版本快一點:

In [17]: %timeit np.angle(flow[...,0] + flow[...,1] * 1j, deg=True)
10 loops, best of 3: 44.5 ms per loop

In [18]: %timeit np.rad2deg(np.arctan2(flow[:,:,1], flow[:,:,0]))
10 loops, best of 3: 35.4 ms per loop

使用np.angle()一種更有效的方法是創建flow的復雜視圖。 如果flow是類型的數組np.float64具有形狀(m, n, 2)然后flow.view(np.complex128)[:,:,0]將是類型的數組np.complex128具有形狀(m, n)

fangle = np.angle(flow.view(np.complex128)[:,:,0], deg=True)

這似乎比使用arctan2rad2deg (但差異不遠於timeit的測量噪聲):

In [47]: %timeit np.angle(flow.view(np.complex128)[:,:,0], deg=True)
10 loops, best of 3: 35 ms per loop

請注意,如果flow是作為其他數組的轉置或作為另一個數組的切片使用大於1的步長創建的,則此方法可能不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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