为了保持“只有一种明显的方法来做到这一点”,如何在Numpy中获得矢量(1D数组)的大小?
def mag(x):
return math.sqrt(sum(i**2 for i in x))
上述功能是有效的,但我无法相信我必须自己指定这样一个微不足道的核心功能。
为了保持“只有一种明显的方法来做到这一点”,如何在Numpy中获得矢量(1D数组)的大小?
def mag(x):
return math.sqrt(sum(i**2 for i in x))
上述功能是有效的,但我无法相信我必须自己指定这样一个微不足道的核心功能。
当前回答
如果你担心速度,你应该使用:
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
其他回答
您需要的函数是numpy. linalgg .norm。(我认为它应该以基数numpy作为数组的属性——比如x.m om()——但哦,好吧)。
import numpy as np
x = np.array([1,2,3,4,5])
np.linalg.norm(x)
你也可以为你想要的n阶范数输入一个可选的词。假设你想要1范数:
np.linalg.norm(x,ord=1)
等等。
如果你担心速度,你应该使用:
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
取每个指标的平方,然后求和,然后开根号。
import numpy as np
def magnitude(v):
return np.sqrt(np.sum(np.square(v)))
print(magnitude([3,4]))
使用scipy中的函数规范。Linalg(或numpy.linalg)
>>> from scipy import linalg as LA
>>> a = 10*NP.random.randn(6)
>>> a
array([ 9.62141594, 1.29279592, 4.80091404, -2.93714318,
17.06608678, -11.34617065])
>>> LA.norm(a)
23.36461979210312
>>> # compare with OP's function:
>>> import math
>>> mag = lambda x : math.sqrt(sum(i**2 for i in x))
>>> mag(a)
23.36461979210312
给出一个单个5D向量的例子:
x = np.array([1,-2,3,-4,5])
通常你会这样编码:
from scipy import linalg
mag = linalg.norm(x)
对于不同类型的输入(矩阵或5D向量的堆栈(批)),请检查一致描述API的参考文档。 https://numpy.org/doc/stable/reference/generated/numpy.linalg.norm.html
OR
如果虚拟环境是新鲜的,scipy是缺失的,只需输入
mag = np.sqrt(x.dot(x))