首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Numpy中获得向量的大小?

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

Stack Overflow用户
提问于 2012-02-07 12:48:50
回答 7查看 409K关注 0票数 211

为了与“只有一种显而易见的方法”保持一致,如何在Numpy中获得向量(一维数组)的大小?

代码语言:javascript
复制
def mag(x): 
    return math.sqrt(sum(i**2 for i in x))

上面的方法是有效的,但我不相信我必须自己指定这样一个琐碎而核心的函数。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-02-07 12:54:44

您想要的函数是numpy.linalg.norm。(我认为它应该在base numpy中作为数组的一个属性--比方说x.norm() --但是哦,好吧)。

代码语言:javascript
复制
import numpy as np
x = np.array([1,2,3,4,5])
np.linalg.norm(x)

您还可以为您想要的第n阶规范输入一个可选的ord。假设你想要1-范数:

代码语言:javascript
复制
np.linalg.norm(x,ord=1)

诸若此类。

票数 284
EN

Stack Overflow用户

发布于 2012-02-08 05:52:19

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

代码语言:javascript
复制
mag = np.sqrt(x.dot(x))

以下是一些基准测试:

代码语言:javascript
复制
>>> 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循环。例如:

代码语言:javascript
复制
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
票数 114
EN

Stack Overflow用户

发布于 2014-05-10 09:47:24

另一种选择是对任一数组使用numpy中的einsum函数:

代码语言:javascript
复制
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

或向量:

代码语言:javascript
复制
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

然而,似乎确实有一些与调用它相关的开销,这可能会使它在小输入时变得更慢:

代码语言:javascript
复制
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
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9171158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档