向量:一組數的基本表示方法 和向量相對應,一個數字,成為標量 向量是線性代數研究的基本元素
import math
from ._global import EPSILON
class Vector:
def __init__(self, lst):
self._values = list(lst) # 相當於複製了一次lst,使得這個類更符合不可更改型別
@classmethod
def zero(cls, dim):
"""返回一個dim維的零向量"""
return cls([0] * dim)
def norm(self):
"""返回向量的模"""
return math.sqrt(sum(e ** 2 for e in self))
def normalize(self):
"""返回向量的單位向量"""
# if self.norm() == 0:
if self.norm() < EPSILON:
raise ZeroDivisionError("Normalize error! norm is zero!")
# return Vector([e / self.norm() for e in self])
return 1 / self.norm() * Vector(self._values)
def __add__(self, another):
"""向量加法,返回結果向量"""
assert len(self) == len(another), \
"Error in adding. Length of vectors must be same."
# 因為實現了__iter__,就不這樣寫了
# return Vector([a + b for a, b in zip(self._values, another._values)])
return Vector([a + b for a, b in zip(self, another)])
def __sub__(self, other):
assert len(self) == len(other), \
"Error in adding. Length of vectors must be same."
return Vector([a - b for a, b in zip(self, other)])
def __mul__(self, k):
"""返回數量乘法的結果向量:self * k"""
return Vector([k * e for e in self])
def dot(self, another):
"""向量點乘,返回結果標量"""
assert len(self) == len(another), \
"Error in adding. Length of vectors must be same."
return sum(a * b for a, b in zip(self, another))
def __rmul__(self, k):
"""返回數量乘法的結果向量:k * self"""
return self * k
def __truediv__(self, k):
"""返回梳理出發的結果向量: self / k """
return (1 / k) * self
def __pos__(self):
"""返回向量取正的結果向量"""
return 1 * self
def __neg__(self):
"""返回向量取負的結果向量"""
return -1 * self
def __iter__(self):
"""返回向量的迭代器"""
return self._values.__iter__()
def __getitem__(self, index):
"""取向量的第index個元素"""
return self._values[index]
def __len__(self):
"""返回向量長度(有多少個元素)"""
return len(self._values)
def __repr__(self):
return "Vector({})".format(self._values)
def __str__(self):
return "({})".format(", ".join(str(e) for e in self._values))
複製程式碼
在實現這個向量類時,學習到很多實現細節:向量類設計為不可更改類(在加法運算時,返回新的類,而不是對原有的self._values進行更改)。 那在建構函式中,傳入一個list,當list變化時,便會影響self._values的值。所以用list(lst)方式進行了一次複製。
向量的模:即向量的大小
單位向量:長度保持為1的向量
矩陣
矩陣是向量的擴充,就像向量是數的擴充
矩陣的基本運算: