【问题标题】:Normalising rows in numpy matrix规范化numpy矩阵中的行
【发布时间】:2016-06-20 04:50:40
【问题描述】:

我正在尝试使用 L2 范数(统一长度)规范化 numpy 矩阵的行。

当我这样做时,我发现了一个问题。

假设我的矩阵'b'如下:

现在,当我按如下方式对第一行进行标准化时,它可以正常工作。

但是当我尝试通过遍历所有行并转换相同的矩阵 b 来做到这一点时,它给了我全零。

知道为什么会发生这种情况以及如何获得正确的标准化吗?

有没有更快的矩阵行归一化方法而不必迭代每一行?我不想使用 sci-kit 学习规范化功能。

谢谢

【问题讨论】:

  • try:- from future import Division
  • 请将您的代码放入代码块中。请勿使用图片 - 我们无法复制和运行您的代码。
  • @Shubham Sharma:我不认为from __future__ import division 在这种情况下会有所帮助,尽管如果您使用的是 Python2,这样做是一种很好的做法(如果您使用的是 Python3,则完全忽略)。请注意它是__future__ 而不是future
  • 我添加了 2 个下划线,但不知何故变成了粗体。
  • @Shubham Sharma:使用 ` 符号格式化为代码。有:__future__,没有:未来

标签: python numpy matrix


【解决方案1】:

问题在于b 的类型为int,因此当您逐行填写时,numpy 会自动将您的计算结果 (float) 转换为int,因此为零.避免这种情况的一种方法是使用0.1. 等来定义b 类型为float,或者只是在定义中添加.astype(float)

这应该可以一次性完成计算,也不需要先转换为float

b = b / np.linalg.norm(b, axis=1, keepdims=True)

之所以有效,是因为您正在重新定义整个数组,而不是一一更改其行,而 numpy 足够聪明,可以使它成为 float

【讨论】:

    猜你喜欢
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2013-06-07
    • 1970-01-01
    • 2021-02-16
    • 2015-06-04
    相关资源
    最近更新 更多