如何在 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
没有进行一些安全检查,因此您应该确保 vectors
的 dtype
足以存储量级足够准确。
关于python - NumPy:如何快速归一化许多向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2850743/