是的,有一个矢量类:它在 事实上 标准 NumPy的 模块。你创建这样的矢量:
>>> v = numpy.array([1, 10, 123]) >>> 2*v array([ 2, 20, 246]) >>> u = numpy.array([1, 1, 1]) >>> v-u array([ 0, 9, 122])
NumPy非常丰富,可让您访问快速阵列操作:点积( numpy.dot() ),规范( numpy.linalg.norm() )等
numpy.dot()
numpy.linalg.norm()
我也需要一个快速的解决方案,所以我只是将numpy的数组包装到我自己的数组中。您会注意到一些可以根据自己的需求进行更改的设计决策(如默认设置)。 如果您想使用它: https://gist.github.com/eigencoder/c029d7557e1f0828aec5
import numpy as np class Point(np.ndarray): """ n-dimensional point used for locations. inherits +, -, * (as dot-product) > p1 = Point([1, 2]) > p2 = Point([4, 5]) > p1 + p2 Point([5, 7]) See ``test()`` for more usage. """ def __new__(cls, input_array=(0, 0)): """ :param cls: :param input_array: Defaults to 2d origin """ obj = np.asarray(input_array).view(cls) return obj @property def x(self): return self[0] @property def y(self): return self[1] @property def z(self): """ :return: 3rd dimension element. 0 if not defined """ try: return self[2] except IndexError: return 0 def __eq__(self, other): return np.array_equal(self, other) def __ne__(self, other): return not np.array_equal(self, other) def __iter__(self): for x in np.nditer(self): yield x.item() def dist(self, other): """ Both points must have the same dimensions :return: Euclidean distance """ return np.linalg.norm(self - other) def test(): v1 = Point([1, 2, 3]) v2 = Point([4, 5, 7]) v3 = Point([4, ]) sum12 = Point([5, 7, 10]) dot12 = Point([4, 10, 21]) # Access assert v2.x == 4 assert v2.y == 5 assert v2.z == 7 assert v3.z == 0 assert Point().x == 0 assert v2[0] == 4 assert v1[-1] == 3 # Not needed but inherited assert [x for x in v2] == [4, 5, 7], "Iteration should return all elements" # Operations assert v1 + v2 == sum12 assert v1 * v2 == dot12 assert v1.dist(v2) ** 2 == 34 assert v1 != v2 assert v2.size == 3, "v2 should be a 3d point" print "pass" if __name__ == "__main__": test()
该 向量 上课 numpy 在线性代数方面可能是 numpy.matrix 这是。的子类 numpy.ndarray 。它不干净 本身 但它使代码更清晰,因为假设代数运算而不是元素。
numpy
numpy.matrix
numpy.ndarray
In [77]: a = np.array([1,2]) In [78]: b = np.array([3,3]) In [79]: a*b Out[79]: array([3, 6]) In [80]: np.dot(a,b) Out[80]: 9 In [81]: np.outer(a,b) Out[81]: array([[3, 3], [6, 6]]) In [82]: a = np.matrix(a).T In [83]: b = np.matrix(b) In [84]: b*a Out[84]: matrix([[9]]) In [85]: a*b Out[85]: matrix([[3, 3], [6, 6]])
如果您想创建自己的,请将其基于其中一个,例如:
class v2d(np.ndarray): def __abs__(self): return np.linalg.norm(self) def dist(self,other): return np.linalg.norm(self-other) def dot(self, other): return np.dot(self, other) # and so on
在最简单的情况下,您可以通过查看来制作 ndarray 作为你的新班级:
ndarray
In [63]: a = np.array([1,2]).view(v2d) In [64]: b = np.array([3,3]).view(v2d) In [65]: a Out[65]: v2d([1, 2]) In [66]: abs(b) Out[66]: 4.2426406871192848 In [67]: a - b Out[67]: v2d([-2, -1]) In [68]: a*b Out[68]: v2d([3, 6]) In [69]: a*3 Out[69]: v2d([3, 6]) In [70]: a.dist(b) Out[70]: 2.2360679774997898 In [71]: b.dist(a) Out[71]: 2.2360679774997898 In [72]: a.dot(b) Out[72]: 9
以下是有关的更多信息 子类化 ndarray 。