• 线性代数-Python-01:向量的基本运算 - 手写Vector及numpy的基本用法


    一、代码仓库

    https://github.com/Chufeng-Jiang/Python-Linear-Algebra-for-Beginner/tree/main

    二、向量的基本运算

    2.1 加法

    在这里插入图片描述

    2.2 数量乘法

    在这里插入图片描述

    2.3 向量运算的基本性质

    在这里插入图片描述

    2.4 零向量

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.5 向量的长度

    在这里插入图片描述在这里插入图片描述

    2.6 单位向量

    单位向量叫做 u hat
    在这里插入图片描述
    在这里插入图片描述

    2.7 点乘/内积:两个向量的乘法 --答案是一个标量

    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    三、手写Vector代码

    3.1 在控制台测试__repr__和__str__方法

    在这里插入图片描述

    3.2 创建实例测试代码

    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]))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    3.3 完整代码

    在这里插入图片描述

    Vector.py

    import math
    from ._globals import EPSILON
    class Vector:
    
        def __init__(self, lst):
            """
            __init__ 代表类的构造函数
            双下划线开头的变量 例如_values,代表类的私有成员
            lst是个引用,list(lst)将值复制一遍,防止用户修改值
            """
            self._values = list(lst)
    
        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 norm(self):
            """返回向量的模"""
            return math.sqrt(sum(e**2 for e in self))
    
        def normalize(self):
            """
            归一化,规范化
            返回向量的单位向量
            此处设计到了除法: def __truediv__(self, k):
            """
            if self.norm() < EPSILON:
                raise ZeroDivisionError("Normalize error! norm is zero.")
            return Vector(self._values) / self.norm()
            # return 1 / self.norm() * Vector(self._values)
            # return Vector([e / self.norm() for e in self])
    
        def __truediv__(self, k):
            """返回数量除法的结果向量:self / k"""
            return (1 / k) * self
    
        @classmethod
        def zero(cls, dim):
            """返回一个dim维的零向量
            @classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的cls参数,可以来调用类的属性,类的方法,实例化对象等。
            """
            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._values, another._values)])
            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 __mul__(self, k):
            """返回数量乘法的结果向量:self * k"""
            return Vector([k * e for e in self])
    
        def __rmul__(self, k):
            """
            返回数量乘法的结果向量:k * self
            self本身就是一个列表
            """
            return self * k
    
        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):
            """打印显示:Vector([5, 2])"""
            return "Vector({})".format(self._values)
    
        def __str__(self):
            """打印显示:(5, 2)"""
            return "({})".format(", ".join(str(e) for e in self._values))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96

    _globals.py

    # 包中的变量,但是对包外不可见,因此使用“_”开头
    EPSILON = 1e-8
    
    • 1
    • 2

    main_vector.py

    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("========点乘:========")
        print(vec.dot(vec2))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    main_numpy_vector.py

    import numpy as np
    
    if __name__ == "__main__":
    
        print(np.__version__)
    
        # np.array 基础
        print("========np.array 基础========")
        lst = [1, 2, 3]
        lst[0] = "Linear Algebra"
        print(lst)
        print("========vec = np.array([1, 2, 3])========")
        vec = np.array([1, 2, 3])
        print(vec)
        # vec[0] = "Linear Algebra"
        # vec[0] = 666
        # print(vec)
        print("========np.array的创建========")
        # np.array的创建
        print(np.zeros(5))
        print(np.ones(5))
        print(np.full(5, 666))
        print("========np.array的基本属性========")
        # 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]))
        print("========np.array的基本运算========")
        # 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("========求模========")
        print(np.linalg.norm(vec))
        print("========归一化========")
        print(vec / np.linalg.norm(vec))
        print("========单位向量========")
        print(np.linalg.norm(vec / np.linalg.norm(vec)))
        print("========零向量会报错========")
        zero3 = np.zeros(3)
        print(zero3 / np.linalg.norm(zero3))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
  • 相关阅读:
    分销模式为用户解决哪些痛点?
    并查集的应用
    Makefile输出调试信息print(第二节)
    【小沐学NLP】AI辅助编程工具汇总
    C++新建单层文件目录和创建多层目录,mkdir返回 -1 问题
    JS如何实现书签导入导出?我是这么做的
    使用AlphaFold2进行蛋白质结构预测
    【机器学习】贝叶斯分类器【下】
    图像的表示与通道数问题、读取并展示图片、cv2.imread(filename, flags=None)
    Python中的元组
  • 原文地址:https://blog.csdn.net/jiangchufeng123/article/details/133897673