如何计算大型 mxnx3 数组中向量的范数?
how to calculate the norm of a vector in a large mxnx3 array?
假设我有一个形状为(m,n,3)的数组,其中m和n指的是一个点的y坐标和x坐标,每个点中的3个数字指的是一个三维向量. (类似的情况是高m宽n的图像,3指的是rgb分量)。
假设我想对每个向量进行归一化以获得该点的法向量,如何高效地进行?我只知道可以用嵌套的for循环遍历每个点,用scipy.lialg.norm得到该点向量的范数,再简单除法就可以得到单位向量。但是有什么方法可以像使用矢量化代码那样高效地做到这一点吗?
感谢
您只需将数组除以数组最后一个维度的平方和的平方和即可。
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),这可以通过做(其中 None
和 np.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]])
假设我有一个形状为(m,n,3)的数组,其中m和n指的是一个点的y坐标和x坐标,每个点中的3个数字指的是一个三维向量. (类似的情况是高m宽n的图像,3指的是rgb分量)。
假设我想对每个向量进行归一化以获得该点的法向量,如何高效地进行?我只知道可以用嵌套的for循环遍历每个点,用scipy.lialg.norm得到该点向量的范数,再简单除法就可以得到单位向量。但是有什么方法可以像使用矢量化代码那样高效地做到这一点吗?
感谢
您只需将数组除以数组最后一个维度的平方和的平方和即可。
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),这可以通过做(其中 None
和 np.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]])