Python NumPy向量数学

19

请问numpy中有哪些类或操作可以用来替代euclid的二维向量类/操作(例如:euclid.Vector2)?

到目前为止,我创建了两个向量。

import numpy as np

loc = np.array([100., 100.])
vel = np.array([30., 10])

loc += vel

# reseting speed to a default value, maintaining direction
vel.normalize()
vel *= 200

loc += vel

如果我错了,有人可以纠正我,但我认为你正在做的是相当标准的。 - prelic
1
需要注意的一件事是数组的乘法。Numpy数组按元素相乘。如果你想要将两个向量相乘,可以使用dot()方法。 - Roland Smith
1
根据评论和答案,我认为人们完全误解了你的问题,并没有意识到你在谈论替换“euclid”模块。 - MestreLion
顺便问一下,迁移怎么样了?是出于性能方面的考虑吗?我打算使用 euclid,所以欢迎任何建议 :) - MestreLion
1个回答

36
您可以直接使用numpy数组。请查看针对Matlab用户的numpy页面,详细了解数组与矩阵之间的优缺点。
正如我在评论中提到的,必须使用dot()函数或方法来进行向量乘法是最大的陷阱。但是,numpy数组是一致的。所有操作都是逐元素进行的。因此,添加或减去数组以及与标量相乘的操作都像向量预期的那样工作。 编辑2:从Python 3.5和numpy 1.10开始,您可以使用@中缀运算符进行矩阵乘法,感谢pep 465编辑:关于您的评论:
  1. Yes. The whole of numpy is based on arrays.

  2. Yes. linalg.norm(v) is a good way to get the length of a vector. But what you get depends on the possible second argument to norm! Read the docs.

  3. To normalize a vector, just divide it by the length you calculated in (2). Division of arrays by a scalar is also element-wise.

    An example in ipython:

    In [1]: import math
    
    In [2]: import numpy as np
    
    In [3]: a = np.array([4,2,7])
    
    In [4]: np.linalg.norm(a)
    Out[4]: 8.3066238629180749
    
    In [5]: math.sqrt(sum([n**2 for n in a]))
    Out[5]: 8.306623862918075
    
    In [6]: b = a/np.linalg.norm(a)
    
    In [7]: np.linalg.norm(b)
    Out[7]: 1.0
    

    Note that In [5] is an alternative way to calculate the length. In [6] shows normalizing the vector.


[1] 这是使用的常见路径吗?(使用 numpy.array vs euclid 或其他什么) [2] 要获取 Vector2.magnitude(),我使用 linalg.norm(v) 吗? [3] 用于 Vector2.normalize() 的函数是什么? - ninMonkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接