【问题标题】:Normalizing vectors contained in an array归一化包含在数组中的向量
【发布时间】:2019-11-08 16:52:58
【问题描述】:

我有一个名为 X 的数组,其中每个元素本身都是一个二维向量。这个数组的对角线只填充了零向量。 现在我需要标准化这个数组中的每个向量,而不改变它的结构。

首先,我尝试计算每个向量的范数并将其放入一个名为 N 的数组中。之后,我想将 X 的每个元素除以 N 的每个元素。 我遇到了两个问题:

1) N 的许多条目为零,当我尝试除以它们时,这显然是一个问题。

2) 数组的形状不匹配,因此 np.divide() 无法按预期工作。

除此之外,我不认为像这样计算 N 是个好主意,因为以后我希望能够对两个以上的向量做同样的事情。

import numpy as np

# Example array
X = np.array([[[0, 0], [1, -1]], [[-1, 1], [0, 0]]])
# Array containing the norms
N = np.vstack((np.linalg.norm(X[0], axis=1), np.linalg.norm(X[1], 
axis=1)))
R = np.divide(X, N)

我希望输出如下所示:

R = np.array([[[0, 0], [0.70710678, -0.70710678]], [[-0.70710678, 0.70710678], [0, 0]]])

【问题讨论】:

  • 上面的 D 是什么?您能否提供一个定义,以便我可以尝试运行您的代码?
  • @jerremaier 看到我的回答,如果有帮助请告诉我
  • 如果除以范数是你想要做的,但有范数为 0 的情况,你可以使用f = lambda Y: Y / np.linalg.norm(Y) if np.linalg.norm(Y) else 0 并使用来自@serafeim 的列表推导。 Norm 不应该为 0,除非整个数组都用 0 填充 [或非常小的数字 :)]
  • @HaydenEastwood D 应该是 X,抱歉。我修正了我的错误

标签: python arrays python-3.x divide-by-zero normalize


【解决方案1】:

您不需要使用sklearn。只需定义一个函数,然后使用列表推导:

假设 X 的第 0 维等于您拥有的二维数组的数量,请使用:

import numpy as np

# Example array
X = np.array([[[0, 0], [1, -1]], [[-1, 1], [0, 0]]])

def stdmtx(X):
    X= X - X.mean(axis =1)[:, np.newaxis]
    X= X / X.std(axis= 1, ddof=1)[:, np.newaxis]
    return np.nan_to_num(X)

R = np.array([stdmtx(X[i,:,:]) for i in range(X.shape[0])])

想要的输出R:

array([[[ 0.        ,  0.        ],
        [ 0.70710678, -0.70710678]],

       [[-0.70710678,  0.70710678],
        [ 0.        ,  0.        ]]])

【讨论】:

  • 非常感谢!这真的很管用!我只是不完全了解您如何计算函数中的范数。
  • 我分别计算每个变量的均值和标准差,然后删除变量特定均值并除以每个变量的变量特定标准
  • 请点赞并接受我的回答,因为它正确地解决了您的问题
猜你喜欢
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
相关资源
最近更新 更多