2015-05-22 81 views
0

假設我有一個形狀(m,n,3)的數組,其中m和n指向一個點的y和x座標,並且每個點中的3個數字指向一個三維向量。 (類似的情況是高度爲m,寬度爲n的圖像,3表示rgb組件)。如何計算大型mxnx3數組中向量的範數?

假設我想對每個向量進行歸一化以獲得該點的法線向量,那麼該如何有效地執行?我只知道我可以使用一個嵌套for循環遍歷每個點,並使用scipy.lialg.norm來獲得該點的向量範數,然後我可以通過簡單的分割來獲得單位向量。但是有沒有什麼辦法可以像使用矢量化代碼一樣高效地執行?

感謝

回答

1

你只應該由你的數組的最後一維的平方和的平方根除以你的陣列。

In [1]: import numpy as np 

In [2]: x = np.random.rand(1000, 500, 3) 

In [3]: normed = x/np.sqrt((x**2).sum(axis=-1))[:,:,None] 
     #None could be np.newaxis 

注意,如果要單獨計算規範然後通過規範劃分數組,你將需要確保形狀是兼容的,這如果你只是把一個(N,他們不會, M,3)陣列由(N,M)範數陣列組成。規範數組需要一個額外的維度,即(N,M,1),這可以實現(其中Nonenp.newaxis可以互換使用)。

normed[...,None], normed[:,:,None], normed.reshape(N, M, 1), etc... 

這裏是原來的第一和最後一個值:

In [4]: x[(0, -1), (0, -1)] 
Out[4]: 
array([[ 0.36461324, 0.16861872, 0.53603133], 
     [ 0.37323254, 0.15314778, 0.1338908 ]]) 

現在範:

In [5]: normed[(0,-1),(0,-1)] 
Out[5]: 
array([[ 0.5443173 , 0.2517245 , 0.80022088], 
     [ 0.87805199, 0.36028936, 0.31498615]])