【问题标题】:how to calculate the norm of a vector in a large mxnx3 array?如何计算大型 mxnx3 数组中向量的范数?
【发布时间】:2015-08-04 15:52:36
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: python arrays scipy vectorization linear-algebra


    【解决方案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]])
    

    【讨论】:

      猜你喜欢
      • 2012-06-11
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2016-09-14
      • 2018-11-12
      • 2011-02-25
      相关资源
      最近更新 更多