簡體   English   中英

用向量作為numpy中的條目迭代矩陣的最快方法

[英]Fastest way to Iterate a Matrix with vectors as entries in numpy

我在python的opencv庫中使用一個函數來獲取手的光流運動。 具體是http://docs.opencv.org/modules/video/doc/motion_analysis_and_object_tracking.html#calcopticalflowfarneback

此函數輸出一個numpy數組

flow = cv2.calcOpticalFlowFarneback(prevgray, gray, 0.5, 3, 15, 3, 5, 1.2, 0)
print flow.shape # prints (480,320,2)

因此,流是一個矩陣,每個條目都是一個向量。 我想要一種量化此矩陣的方法,因此我雖然使用了L1矩陣范數(numpy.linalg.norm(flow,1)),但該范數會給范數錯誤帶來不正確的尺寸。

我正在考慮通過計算每個矢量的歐幾里得范數然后找到帶有矢量距離的矩陣的L1范數來解決這個問題。

我無法有效地迭代流矩陣。 我已經通過先遍歷列然后遍歷行使用了兩個for循環來完成它,但這太慢了。

            r,c,d = flow.shape 
            flowprime = numpy.zeros((r,c),flow.dtype)
            for i in range(0,r):
                for j in range (0,c):
                    flowprime[i,j] = numpy.linalg.norm(flow[i,j], 2)
            print(numpy.linalg.norm(flowprime, 1))

我也嘗試使用numpy.nditer但

for x in numpy.nditer(flow, op_flags=['readwrite']):
   print x

僅輸出單個值而不是向量。

用向量作為條目遍歷numpy矩陣,對其進行規范然后采用L1規范的最快方法是什么?

從numpy版本1.9開始, norm采用axis參數。

除此之外,說出理想的想法,幾乎可以肯定的是,您可以要求numpy做到。 例如,假設沒有復雜的條目或缺少值,則最簡單的情況為np.sqrt((flow**2).sum())或我認為您描述的情況為np.linalg.norm(np.sqrt((flow**2).sum(axis=-1)),1)

暫無
暫無

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

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