forked from liuyubobobo/Play-with-Linear-Algebra
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
25faa0d
commit 103a0f2
Showing
15 changed files
with
255 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
from playLA.Matrix import Matrix | ||
|
||
|
||
if __name__ == "__main__": | ||
|
||
matrix = Matrix([[1, 2], [3, 4]]) | ||
print(matrix) | ||
print("matrix.shape = {}".format(matrix.shape())) | ||
print("matrix.size = {}".format(matrix.size())) | ||
print("len(matrix) = {}".format(len(matrix))) | ||
print("matrix[0][0] = {}".format(matrix[0, 0])) |
File renamed without changes.
File renamed without changes.
44 changes: 44 additions & 0 deletions
44
04-The-Matrix/02-Implement-Our-Own-Matrix/playLA/Matrix.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
from .Vector import Vector | ||
|
||
|
||
class Matrix: | ||
|
||
def __init__(self, list2d): | ||
self._values = [row[:] for row in list2d] | ||
|
||
def row_vector(self, index): | ||
"""返回矩阵的第index个行向量""" | ||
return Vector(self._values[index]) | ||
|
||
def col_vector(self, index): | ||
"""返回矩阵的第index个列向量""" | ||
return Vector([row[index] for row in self._values]) | ||
|
||
def __getitem__(self, pos): | ||
"""返回矩阵pos位置的元素""" | ||
r, c = pos | ||
return self._values[r][c] | ||
|
||
def size(self): | ||
"""返回矩阵的元素个数""" | ||
r, c = self.shape() | ||
return r * c | ||
|
||
def row_num(self): | ||
"""返回矩阵的行数""" | ||
return self.shape()[0] | ||
|
||
__len__ = row_num | ||
|
||
def col_num(self): | ||
"""返回矩阵的列数""" | ||
return self.shape()[1] | ||
|
||
def shape(self): | ||
"""返回矩阵的形状: (行数, 列数)""" | ||
return len(self._values), len(self._values[0]) | ||
|
||
def __repr__(self): | ||
return "Matrix({})".format(self._values) | ||
|
||
__str__ = __repr__ |
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
45 changes: 45 additions & 0 deletions
45
04-The-Matrix/04-Implement-Basic-Operations-of-Matrix/main_numpy_vector.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
import numpy as np | ||
|
||
if __name__ == "__main__": | ||
|
||
print(np.__version__) | ||
|
||
# np.array 基础 | ||
lst = [1, 2, 3] | ||
lst[0] = "Linear Algebra" | ||
print(lst) | ||
|
||
vec = np.array([1, 2, 3]) | ||
print(vec) | ||
# vec[0] = "Linear Algebra" | ||
# vec[0] = 666 | ||
# print(vec) | ||
|
||
# np.array的创建 | ||
print(np.zeros(5)) | ||
print(np.ones(5)) | ||
print(np.full(5, 666)) | ||
|
||
# np.array的基本属性 | ||
print(vec) | ||
print("size =", vec.size) | ||
print("size =", len(vec)) | ||
print(vec[0]) | ||
print(vec[-1]) | ||
print(vec[0: 2]) | ||
print(type(vec[0: 2])) | ||
|
||
# np.array的基本运算 | ||
vec2 = np.array([4, 5, 6]) | ||
print("{} + {} = {}".format(vec, vec2, vec + vec2)) | ||
print("{} - {} = {}".format(vec, vec2, vec - vec2)) | ||
print("{} * {} = {}".format(2, vec, 2 * vec)) | ||
print("{} * {} = {}".format(vec, vec2, vec * vec2)) | ||
print("{}.dot({}) = {}".format(vec, vec2, vec.dot(vec2))) | ||
|
||
print(np.linalg.norm(vec)) | ||
print(vec / np.linalg.norm(vec)) | ||
print(np.linalg.norm(vec / np.linalg.norm(vec))) | ||
|
||
# zero3 = np.zeros(3) | ||
# print(zero3 / np.linalg.norm(zero3)) |
39 changes: 39 additions & 0 deletions
39
04-The-Matrix/04-Implement-Basic-Operations-of-Matrix/main_vector.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
from playLA.Vector import Vector | ||
|
||
if __name__ == "__main__": | ||
|
||
vec = Vector([5, 2]) | ||
print(vec) | ||
print("len(vec) = {}".format(len(vec))) | ||
print("vec[0] = {}, vec[1] = {}".format(vec[0], vec[1])) | ||
|
||
vec2 = Vector([3, 1]) | ||
print("{} + {} = {}".format(vec, vec2, vec + vec2)) | ||
print("{} - {} = {}".format(vec, vec2, vec - vec2)) | ||
|
||
print("{} * {} = {}".format(vec, 3, vec * 3)) | ||
print("{} * {} = {}".format(3, vec, 3 * vec)) | ||
|
||
print("+{} = {}".format(vec, +vec)) | ||
print("-{} = {}".format(vec, -vec)) | ||
|
||
zero2 = Vector.zero(2) | ||
print(zero2) | ||
print("{} + {} = {}".format(vec, zero2, vec + zero2)) | ||
|
||
print("norm({}) = {}".format(vec, vec.norm())) | ||
print("norm({}) = {}".format(vec2, vec2.norm())) | ||
print("norm({}) = {}".format(zero2, zero2.norm())) | ||
|
||
print("normalize {} is {}".format(vec, vec.normalize())) | ||
print(vec.normalize().norm()) | ||
|
||
print("normalize {} is {}".format(vec2, vec2.normalize())) | ||
print(vec2.normalize().norm()) | ||
|
||
try: | ||
zero2.normalize() | ||
except ZeroDivisionError: | ||
print("Cannot normalize zero vector {}.".format(zero2)) | ||
|
||
print(vec.dot(vec2)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
82 changes: 82 additions & 0 deletions
82
04-The-Matrix/04-Implement-Basic-Operations-of-Matrix/playLA/Vector.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
import math | ||
from ._globals import EPSILON | ||
|
||
|
||
class Vector: | ||
|
||
def __init__(self, lst): | ||
self._values = list(lst) | ||
|
||
@classmethod | ||
def zero(cls, dim): | ||
"""返回一个dim维的零向量""" | ||
return cls([0] * dim) | ||
|
||
def __add__(self, another): | ||
"""向量加法,返回结果向量""" | ||
assert len(self) == len(another), \ | ||
"Error in adding. Length of vectors must be same." | ||
|
||
return Vector([a + b for a, b in zip(self, another)]) | ||
|
||
def __sub__(self, another): | ||
"""向量减法,返回结果向量""" | ||
assert len(self) == len(another), \ | ||
"Error in subtracting. Length of vectors must be same." | ||
|
||
return Vector([a - b for a, b in zip(self, another)]) | ||
|
||
def norm(self): | ||
"""返回向量的模""" | ||
return math.sqrt(sum(e**2 for e in self)) | ||
|
||
def normalize(self): | ||
"""返回向量的单位向量""" | ||
if self.norm() < EPSILON: | ||
raise ZeroDivisionError("Normalize error! norm is zero.") | ||
return Vector(self._values) / self.norm() | ||
|
||
def dot(self, another): | ||
"""向量点乘,返回结果标量""" | ||
assert len(self) == len(another), \ | ||
"Error in dot product. Length of vectors must be same." | ||
|
||
return sum(a * b for a, b in zip(self, another)) | ||
|
||
def __mul__(self, k): | ||
"""返回数量乘法的结果向量:self * k""" | ||
return Vector([k * e for e in self]) | ||
|
||
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)) |
1 change: 1 addition & 0 deletions
1
04-The-Matrix/04-Implement-Basic-Operations-of-Matrix/playLA/__init__.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from ._globals import EPSILON |
1 change: 1 addition & 0 deletions
1
04-The-Matrix/04-Implement-Basic-Operations-of-Matrix/playLA/_globals.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
EPSILON = 1e-8 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters