当前位置: 首页 > news >正文

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

文章目录

  • 代码
    • 目录结构
    • Vector.py
    • _globals.py
    • main_vector.py
    • main_numpy_vector.py
  • 一、创建属于自己的向量
    • 1.1 在控制台测试__repr__和__str__方法
    • 1.2 创建实例测试代码
  • 二、向量的基本运算
    • 2.1 加法
    • 2.2 数量乘法
    • 2.3 向量运算的基本性质
    • 2.4 零向量
    • 2.5 向量的长度
    • 2.6 单位向量
    • 2.7 点乘/内积:两个向量的乘法 --答案是一个标量

代码

目录结构

F:.
|   main_numpy_vector.py
|   main_vector.py
|
+---.idea
|
\---playLA|   Vector.py|   _globals.py|   __init__.py|\---__pycache__

在这里插入图片描述

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@classmethoddef 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 * selfself本身就是一个列表"""return self * kdef __pos__(self):"""返回向量取正的结果向量"""return 1 * selfdef __neg__(self):"""返回向量取负的结果向量"""return -1 * selfdef __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))

_globals.py

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

main_vector.py

from playLA.Vector import Vectorif __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))

main_numpy_vector.py

import numpy as npif __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))

一、创建属于自己的向量

class Vector:def __init__(self, lst):self._values = lstdef __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.1 在控制台测试__repr__和__str__方法

在这里插入图片描述

1.2 创建实例测试代码

from playLA.Vector import Vectorif __name__ == "__main__":vec = Vector([5, 2])print(vec)print("len(vec) = {}".format(len(vec)))print("vec[0] = {}, vec[1] = {}".format(vec[0], vec[1]))

在这里插入图片描述

二、向量的基本运算

2.1 加法

在这里插入图片描述

2.2 数量乘法

在这里插入图片描述

2.3 向量运算的基本性质

在这里插入图片描述

2.4 零向量

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

2.5 向量的长度

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

2.6 单位向量

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

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

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

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

相关文章:

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

文章目录 代码目录结构Vector.py_globals.pymain_vector.pymain_numpy_vector.py 一、创建属于自己的向量1.1 在控制台测试__repr__和__str__方法1.2 创建实例测试代码 二、向量的基本运算2.1 加法2.2 数量乘法2.3 向量运算的基本性质2.4 零向量2.5 向量的长度2.6 单位向量2.7 …...

数字图像处理实验记录二(直方图和直方图均衡化)

文章目录 一、基础知识1&#xff0c;什么是直方图2&#xff0c;直方图有什么用3&#xff0c;直方图均衡化4、原理代码实现 二、实验要求任务1&#xff1a;任务2&#xff1a; 三、实验记录任务1&#xff1a;任务2&#xff1a; 四、结果展示任务1&#xff1a;任务2&#xff1a; 五…...

大数据Flink(九十九):SQL 函数的解析顺序和系统内置函数

文章目录 SQL 函数的解析顺序和系统内置函数 一、​​​​​​​SQL 函数...

TODO Vue typescript forEach的bug,需要再核實

forEach 一個string[]&#xff0c;只有最後一個匹配條件有效&#xff0c;其它條件無效。 所以&#xff0c;只能替換成普通的for循環。 console.log(taskList)// for (const _task of taskList.value) {// if (_task invoiceSendEmail) {// form.value.invoiceSendEmail…...

简记一个错误

简记一个Flutter错误&#xff1a; Using hardware rendering with device sdk gphone64 x86 64. If you notice graphics artifacts, consider enabling software rendering with “–enable-software-rendering”. Launching lib\main.dart on sdk gphone64 x86 64 in debug …...

第四次作业

1.打印各种图形 A.矩形 a int(input("请输入行数: ")) i 0 while i < a:print("*"*10)i1 结果&#xff1a; B.直角三角形 a int(input("请输入行数: ")) i 0 while i<a:print("*"*(i1))i1 结果&#xff1a; C.反直角三角形 …...

面试问题整理总结

1.自我介绍 2.为什么想转测试 想换一个方向&#xff0c;测试开发在一定程度上也是属于开发&#xff0c;而且站在测试的角度能看到全局的东西更多&#xff0c;对需求的理解需要更深”&#xff0c;之前的开发工作比较专一&#xff0c;测试的视野更加开阔&#xff0c;想要站在更高…...

进阶JAVA篇- Collection 类的常用的API与 Collection 集合的遍历方式

目录 1.0 Collection 类的说明 1.1 Collection 类中的实例方法 2.0 Collection 集合的遍历方式&#xff08;重点&#xff09; 2.1 使用迭代器&#xff08; Iterator &#xff09;进行遍历 2.2 使用增强型 for 循环进行遍历 2.3 使用 Java 8的 Stream API 进行遍历&#xff08;使…...

CentOS | 添加普通用户并授权sudo

sudo -i adduser peter passwd peter whereis sudoers nano /etc/sudoers添加一行新用户到root组 ## Allow root to run any commands anywhere root ALL(ALL) ALL peter ALL(ALL) ALL如果提升权限后无法cd到其他目录等&#xff0c;修改 /etc/passwd 文件&…...

【MyBatis】mybatis工具类迭代

目录 MyBatis工具类的迭代 ThreadLocal使用 mybatis工具类终极版&#xff1a; MyBatis工具类的迭代 public class MyBatisUtil {//工具类构造方法私有化private void MyBatisUtil() {}//方法一public static SqlSession getSqlSession(){try {SqlSessionFactoryBuilder sql…...

MSQL系列(六) Mysql实战-SQL语句优化

Mysql实战-SQL语句优化 前面我们讲解了索引的存储结构&#xff0c;BTree的索引结构&#xff0c;以及索引最左侧匹配原则&#xff0c;Explain的用法&#xff0c;可以看到是否使用了索引&#xff0c;今天我们讲解一下SQL语句的优化及如何优化 文章目录 Mysql实战-SQL语句优化1.…...

kaggle新赛:UBC卵巢癌亚型分类和异常检测大赛【图像分类】

赛题名称&#xff1a;UBC Ovarian Cancer Subtype Classification and Outlier Detection (UBC-OCEAN) 赛题链接&#xff1a;https://www.kaggle.com/competitions/UBC-OCEAN 赛题背景 卵巢癌是女性生殖系统最致命的癌症。目前&#xff0c;卵巢癌诊断依赖病理学家评估亚型。…...

基于nodejs+vue云旅青城系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…...

《孙哥说Spring5》笔记汇总

时隔两个多月&#xff0c;终于将《孙哥说Spring5》的笔记文章全部整理完了&#xff0c;在这里做个汇总。孙哥的Spring课讲的非常好&#xff0c;深度和广度都有所兼顾&#xff0c;推荐大家去看 点击学习《孙哥说Spring5》 基础铺垫 1️⃣ Spring5应用之基础扫盲2️⃣ Spring5应…...

在使用了spring-cloud-starter-gateway后,为什么还会发生cors问题

//1.需要配置类 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.reactive.CorsWebFilter; import org.sp…...

CentOS7安装MySQL8.0.28

CentOS7安装MySQL8.0.28 一、下载MySQL安装包二、安装配置mysql 一、下载MySQL安装包 点击以下链接可以自动跳转&#xff1a;MySQL官网 接下来按如图所示依次点击进入。 选择自己所需要版本 此处如需下载历史版本可以点击 二、安装配置mysql 1、登录ssh或其他相关软件上…...

AutoSAR入门:应用背景及简介

1、应用背景 在我们现在的汽车行业里面&#xff0c;汽车电子的发展过程中&#xff0c;我们发现有一些新的趋势汽车电子系统的复杂性不断增长。 我们现在可以看到车辆有越来越多的功能&#xff0c;那么这些功能呢&#xff0c;也在往这个控制器上进行集中&#xff0c;比如说我们现…...

C++初阶(三)

文章目录 一、auto关键字(C11)1、auto简介2、auto使用规则1、 auto与指针和引用结合起来使用2、 在同一行定义多个变量 3、auto不能推导的场景1、 auto不能作为函数的参数2、 auto不能直接用来声明数组3、特性总结 二、基于范围的for循环(C11)1、范围for的语法2、 范围for的使用…...

PHP的学习入门建议

学习入门PHP的步骤如下&#xff1a; 确定学习PHP的目的和需求&#xff0c;例如是为了开发网站还是为了与数据库交互等。学习PHP的基础语法和程序结构&#xff0c;包括变量、数据类型、循环、条件等。学习PHP的面向对象编程&#xff08;OOP&#xff09;概念和技术。学习与MySQL…...

骰子涂色(Cube painting, UVa 253)rust解法

输入两个骰子&#xff0c;判断二者是否等价。每个骰子用6个字母表示&#xff0c;如图4-7所示。 例如rbgggr和rggbgr分别表示如图4-8所示的两个骰子。二者是等价的&#xff0c;因为图4-8&#xff08;a&#xff09;所示的骰子沿着竖直轴旋转90之后就可以得到图4-8&#xff08;b&a…...

OpenClaw安全指南:gemma-3-12b-it本地化部署的权限管控策略

OpenClaw安全指南&#xff1a;gemma-3-12b-it本地化部署的权限管控策略 1. 为什么需要特别关注OpenClaw的权限管控&#xff1f; 上周我在调试一个自动化文档整理任务时&#xff0c;差点酿成大祸——OpenClaw误将我的工作目录/Documents/ProjectX识别为临时文件夹&#xff0c;…...

港科喜讯|[港科百创]参赛项目上市!视觉语言大模型第一股诞生!

2026年3 月 30 日&#xff0c;山东极视角科技股份有限公司&#xff08;股票代码&#xff1a;6636.HK&#xff09;在香港联合交易所主板正式上市。这家曾斩获香港科技大学第六届百万奖金国际创业大赛深圳赛区一等奖的科创企业&#xff0c;同时也是香港科大"创科行"(第…...

Phi-4-mini-reasoning开源模型教育价值:高校AI课程实验设计与评估标准

Phi-4-mini-reasoning开源模型教育价值&#xff1a;高校AI课程实验设计与评估标准 1. 引言&#xff1a;AI教育的新工具 在人工智能教育领域&#xff0c;如何让学生既能理解前沿技术原理&#xff0c;又能获得实际动手能力&#xff0c;一直是教学设计的难点。Phi-4-mini-reason…...

AudioSeal环境部署:Ubuntu+CUDA 12.x+PyTorch 2.3适配性配置指南

AudioSeal环境部署&#xff1a;UbuntuCUDA 12.xPyTorch 2.3适配性配置指南 1. 引言 如果你正在寻找一种可靠的方法来为AI生成的音频打上“数字指纹”&#xff0c;以便后续进行检测和溯源&#xff0c;那么Meta开源的AudioSeal项目绝对值得你花时间研究。简单来说&#xff0c;A…...

济南精神心理专科:如何识别躯体化障碍的早期信号

济南躯体化障碍疾病就医选择难题在济南&#xff0c;面对躯体化障碍疾病的朋友最关心的是隐私和靠谱。选择一家好的医院至关重要&#xff0c;尤其是看躯体化障碍一定要选专科专业医院。这类医院不仅在专业诊疗上更有优势&#xff0c;还能提供更好的隐私保护和服务体验。本文将基…...

循环冷却水流量示意图设计 建筑水流量示意图绘制教程

一、引言 在建筑给排水、暖通空调及工业循环水系统设计中&#xff0c;循环冷却水流量示意图与建筑水流量示意图是核心技术图纸之一&#xff0c;其作用是直观呈现水流路径、管径规格、流量分配、设备连接关系及压力节点参数&#xff0c;为系统施工、调试、运维及故障排查提供可…...

Vivado Design Suite中BUFG优化策略与实战技巧

1. 理解BUFG的核心作用与设计痛点 在FPGA设计中&#xff0c;时钟信号就像人体神经系统中的电脉冲&#xff0c;需要快速、准确地传递到每个功能单元。BUFG&#xff08;全局时钟缓冲器&#xff09;就是Xilinx器件中专用的"信号放大器"&#xff0c;它能将时钟信号分配到…...

Qwen2.5-0.5B手机AI入门:从下载到对话,30分钟全搞定

Qwen2.5-0.5B手机AI入门&#xff1a;从下载到对话&#xff0c;30分钟全搞定 1. 为什么选择Qwen2.5-0.5B-Instruct&#xff1f; 在移动设备上运行AI大模型听起来像是科幻场景&#xff0c;但Qwen2.5-0.5B-Instruct让它变成了现实。这个由阿里通义实验室开源的轻量级语言模型&am…...

从Simulink模型到神经网络:一个完整的数据驱动建模与验证实践

1. 为什么需要从Simulink模型转向神经网络&#xff1f; 在控制系统工程领域&#xff0c;Simulink模型一直是建模和仿真的黄金标准。但最近几年&#xff0c;越来越多的工程师开始尝试用神经网络来替代传统模型。这背后有几个关键原因&#xff1a; 首先&#xff0c;传统物理模型在…...

Python高效开发技巧汇总

这是一篇关于Python开发的技术文章示例内容&#xff0c;可以替换为真实文章内容。...