如何计算大型mxnx3数组中向量的范数?

时间:2015-05-22 14:50:54

标签: python arrays scipy vectorization linear-algebra

假设我有一个形状(m,n,3)的数组,其中m和n指的是一个点的y和x坐标,每个点中的3个数字指的是一个三维向量。 (类似的情况是高度为m且宽度为n的图像,3为rgb组件的图像)。

假设我想对每个向量进行标准化以获得该点的法向量,如何有效地做到这一点?我只知道我可以使用嵌套的for循环遍历每个点并使用scipy.lialg.norm来获取该点的向量的范数,然后我可以通过简单的除法得到单位向量。但有没有办法像使用矢量化代码一样有效地做到这一点?

谢谢

1 个答案:

答案 0 :(得分:1)

你应该将数组除以数组最后一维的平方和的sqrt。

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

注意,如果你想分别计算规范然后按规范划分数组,你需要确保形状是兼容的,如果你只是划分a(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]])