你如何在 Numpy 中获得向量的大小?

新手上路,请多包涵

为了与“只有一种明显的方法可以做到这一点”保持一致,您如何在 Numpy 中获得向量(一维数组)的大小?

 def mag(x):
    return math.sqrt(sum(i**2 for i in x))

以上工作,但我 不敢相信 我必须自己指定这样一个微不足道的核心功能。

原文由 Nick T 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 662
2 个回答

您追求的功能是 numpy.linalg.norm 。 (我认为它应该在基本 numpy 中作为数组的一个属性——比如 x.norm() 但哦,好吧)。

 import numpy as np
x = np.array([1,2,3,4,5])
np.linalg.norm(x)

您还可以输入可选的 ord 以获得所需的 n 阶标准。假设您想要 1 范数:

 np.linalg.norm(x,ord=1)

等等。

原文由 mathematical.coffee 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您担心速度,您应该改用:

 mag = np.sqrt(x.dot(x))

以下是一些基准:

 >>> import timeit
>>> timeit.timeit('np.linalg.norm(x)', setup='import numpy as np; x = np.arange(100)', number=1000)
0.0450878
>>> timeit.timeit('np.sqrt(x.dot(x))', setup='import numpy as np; x = np.arange(100)', number=1000)
0.0181372

编辑:当您必须采用许多向量的范数时,真正的速度提升就会出现。使用纯 numpy 函数不需要任何 for 循环。例如:

 In [1]: import numpy as np

In [2]: a = np.arange(1200.0).reshape((-1,3))

In [3]: %timeit [np.linalg.norm(x) for x in a]
100 loops, best of 3: 4.23 ms per loop

In [4]: %timeit np.sqrt((a*a).sum(axis=1))
100000 loops, best of 3: 18.9 us per loop

In [5]: np.allclose([np.linalg.norm(x) for x in a],np.sqrt((a*a).sum(axis=1)))
Out[5]: True

原文由 user545424 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题