python - NumPy:如何快速归一化许多向量?

标签 python vector numpy normalization

如何在 NumPy 中优雅地标准化向量列表?

这是一个工作的例子:

from numpy import *

vectors = array([arange(10), arange(10)])  # All x's, then all y's
norms = apply_along_axis(linalg.norm, 0, vectors)

# Now, what I was expecting would work:
print vectors.T / norms  # vectors.T has 10 elements, as does norms, but this does not work

最后一个操作产生“形状不匹配:无法将对象广播到单个形状”。

vectors 中的 2D 向量的归一化如何使用 NumPy 优雅地完成?

编辑:为什么上述方法不起作用,而向 norms 添加维度确实起作用(根据我下面的回答)?

最佳答案

计算幅度

我遇到了这个问题,并对您的标准化方法感到好奇。我使用不同的方法来计算幅度。 注意:我通常还计算最后一个索引的范数(在这种情况下是行,而不是列)。

magnitudes = np.sqrt((vectors ** 2).sum(-1))[..., np.newaxis]

不过,通常情况下,我只是这样标准化:

vectors /= np.sqrt((vectors ** 2).sum(-1))[..., np.newaxis]

时间比较

我跑了一个测试比较时间,发现我的方法快了不少,但是Freddie Witherdon的建议更快。

import numpy as np    
vectors = np.random.rand(100, 25)

# OP's
%timeit np.apply_along_axis(np.linalg.norm, 1, vectors)
# Output: 100 loops, best of 3: 2.39 ms per loop

# Mine
%timeit np.sqrt((vectors ** 2).sum(-1))[..., np.newaxis]
# Output: 10000 loops, best of 3: 13.8 us per loop

# Freddie's (from comment below)
%timeit np.sqrt(np.einsum('...i,...i', vectors, vectors))
# Output: 10000 loops, best of 3: 6.45 us per loop

但要小心,因为 StackOverflow answer注意,einsum 没有进行一些安全检查,因此您应该确保 vectorsdtype 足以存储量级足够准确。

关于python - NumPy:如何快速归一化许多向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2850743/

相关文章:

c++ - 使用 std::partition 对 vector 进行分区

python - PostgreSQL 本地数据未显示在 Docker 容器中

python - 拟合神经网络时出现 UnboundLocalError - TensorFlow 错误?

c++ - 将附加参数传递给 remove_if

C++ 优雅的方式来标记不属于 vector 的索引

python - NumPy Sum(带轴)如何工作?

python - 是否有任何报告具有与 python 的范围报告类似的功能

python - HTTPSConnectionPool(主机 ='s3-us-west-1b.amazonaws.com',端口=443): Max retries exceeded with url

python - Numpy:数组大小有限制吗?

python - Numpy 设置工具 : How to compile fortran file as part of a module