为了与“只有一种明显的方法可以做到这一点”保持一致,您如何在 Numpy 中获得向量(一维数组)的大小?
def mag(x):
return math.sqrt(sum(i**2 for i in x))
以上工作,但我 不敢相信 我必须自己指定这样一个微不足道的核心功能。
原文由 Nick T 发布,翻译遵循 CC BY-SA 4.0 许可协议
为了与“只有一种明显的方法可以做到这一点”保持一致,您如何在 Numpy 中获得向量(一维数组)的大小?
def mag(x):
return math.sqrt(sum(i**2 for i in x))
以上工作,但我 不敢相信 我必须自己指定这样一个微不足道的核心功能。
原文由 Nick T 发布,翻译遵循 CC BY-SA 4.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 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
2 回答1.9k 阅读✓ 已解决
您追求的功能是
numpy.linalg.norm
。 (我认为它应该在基本 numpy 中作为数组的一个属性——比如x.norm()
但哦,好吧)。您还可以输入可选的
ord
以获得所需的 n 阶标准。假设您想要 1 范数:等等。