如何得到一个矢量的数值?

2024-04-25 07:19:06 发布

您现在位置:Python中文网/ 问答频道 /正文

按照“只有一种明显的方法可以做到”的说法,如何得到Numpy中向量(1D数组)的大小?

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

上面的方法是有效的,但是我不能相信我必须自己指定这样一个微不足道的核心功能。


Tags: 方法in功能numpy核心forreturndef
3条回答

另一种选择是在numpy中为任意一个数组使用einsum函数:

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: 3.86 ms per loop

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

In [5]: %timeit np.sqrt(np.einsum('ij,ij->i',a,a))
100000 loops, best of 3: 8.71 µs per loop

或向量:

In [5]: a = np.arange(100000)

In [6]: %timeit np.sqrt(a.dot(a))
10000 loops, best of 3: 80.8 µs per loop

In [7]: %timeit np.sqrt(np.einsum('i,i', a, a))
10000 loops, best of 3: 60.6 µs per loop

但是,调用它似乎会带来一些开销,这可能会使它在小输入时变慢:

In [2]: a = np.arange(100)

In [3]: %timeit np.sqrt(a.dot(a))
100000 loops, best of 3: 3.73 µs per loop

In [4]: %timeit np.sqrt(np.einsum('i,i', a, a))
100000 loops, best of 3: 4.68 µs per loop

你要找的函数是^{}。(我认为它应该在基numpy中作为数组的一个属性——比如x.norm()——但是哦,好吧)。

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

您还可以输入一个可选的ord作为所需的n阶范数。假设你想要一个标准:

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

相关问题 更多 >