Numpy 学习笔记——1. 数组的创建和索引
Numpy 是一个用于科学计算的 Python 扩展库,虽然不是 Python 标准库,但是已经是 Python 在科学计算、机器学习等领域毋庸置疑的基础库,很多主流的 Python 库都依赖 Numpy。 1import numpy as np 一个循序渐进的入门笔记的内容组织比较麻烦,我也并不打算这么做,这个笔记的内容会围绕一些关键点展开,主要参考 Numpy 的官方资料。 ndarray 基本概念np.ndarray (别名 np.array)是 Numpy 的核心数据类型,可以用于存储 n 维数组,并提供了大量相关操作方法。 它与 Python 的 list 类型类似,但是存在更多限制:只能存储同类型数据,并且尺寸是固定且规则的,即不允许各个元素长短不一的数组。这些限制使得 ndarray 的运算非常高效(直接调用底层的 C/C++ 实现)。但是有一点不足的是:Numpy 没有提供稀疏矩阵的数据结构,需要时可以使用其它包提供的稀疏矩阵。 我们主要关注一维数组和二维数组,例如 123array([1, 2, 3]) # shape=(3,)array([[1...
MATLAB 高性能编程笔记
记录一些常用的 MATLAB 编程技巧/规范,目标是写出高性能的 MATLAB 代码,主要参考官方文档中的提升性能的方法。 基础关于代码结构MATLAB 提供了很多方式来执行代码:命令行 vs 脚本 vs 函数,绝大多数代码在不同方式中执行都是等效的,但是考虑优化就不是一回事了。 在涉及 JIT 优化和作用域分析时,函数形式通常更有利于 MATLAB 对代码进行分析,尤其是作用域与类型推断,进而对代码运行进行优化,因此运行效率更高;命令行和脚本则更偏向交互式使用。 在命令行中交互式地调用某些内置函数,相比于从脚本文件中调用,可能会有不一样的结果。 基于模块化编程的思维,避免使用过大的单一文件,考虑将其中重复使用的功能拆分为简洁的函数文件,这种做法可以降低首次运行的成本。 优先使用局部函数而非嵌套函数,嵌套函数可以直接访问外层函数的变量(按照引用捕获),这可能限制 MATLAB 对其进行的优化,更好的做法是将所有需要的变量以函数参数的形式显式传递。 关于内置函数避免重载内置函数,尤其不要对标准 MATLAB 数据类重载内置函数。 在可选的情况下,优先考虑使用 MATL...
MATLAB 踩坑记录
记录一下 MATLAB 踩过的小坑,MATLAB 的各种内置函数的用法实在是太奇怪了,一个小细节就可以搞出各种问题。 矩阵偏移函数 circshift 可以用于向量或矩阵的循环偏移,不会修改原始数据。 向量偏移 123456A = [1, 2, 3, 4, 5];circshift(A, 1)% [5, 1, 2, 3, 4]circshift(A, -1)% [2, 3, 4, 5, 1] 矩阵的偏移就比较复杂了,按照前面的做法会以行为整体进行偏移!!! 1234567A = [1 2 3; 4 5 6; 7 8 9];circshift(A, 1);% 7 8 9% 1 2 3% 4 5 6 如果希望以列进行偏移,有两种方式,第一种方式是额外指定维数(传递两个标量) 1234567A = [1 2 3; 4 5 6; 7 8 9];circshift(A, 1, 2)% 3 1 2% 6 4 5% 9 7 ...
Cpp 多态方案对比——回字的四种写法
虽然C++没有直接提供interface,但是却提供了虚函数、模板类型等各种语法,使得我们可以用各种方式实现多态,这里我们不区分动态多态和静态多态,而是从设计一个框架的角度,分别使用四种方案实现: 虚函数(最简单直接的方式) std::function CRTP(最晦涩的方式) deducing this(可以视作CRTP的简化,不再需要将派生类作为模板参数传递,要求C++23) 需求我们考虑这样一个需求: 基类A包括:(不可实例化) 主方法run:调用func1,func2和func3 实现方法func1 实现方法func2(多态,允许子类修改) 实现方法func3(多态,子类必须实现) 派生类B1:继承A 实现方法func3(多态,允许子类修改) 派生类B2:继承A 实现方法func3(多态,允许子类修改):调用func4 实现方法func4(多态,允许子类修改) 具体类C1:继承B2 实现方法func4 具体类C2:继承B2 实现方法func3 最终我们直接通过各种对象自身来调用run方法,达到如下效果: 12345678Running...
解读一份极其晦涩的 c++ 代码
事先声明,下面的各种语法技巧都是炫技式的,刻意降低代码的可读性,只是写着玩,在实际应用中是不会允许这么乱写的。 先来几个开胃菜。 开胃菜(1) 嵌入网址?下面这段代码看起来是在c++中直接嵌入了一个网址 1234567#include <iostream>int main(){ https://www.zhihu.com std::cout << "Hello World!" << std::endl; return 0;} 它确实是合法的c++代码,但是含义却并不是网址: 左半部分https: 是一个标签,可以通过goto跳转; 右半部分由于//的存在,就是一个注释,直接被忽略了。 下面的代码就更利于理解了 123456789#include <iostream>int main() {label: // 这是注释 std::cout << "Hello World!" << std::endl; g...
Jupyter notebook 本地和远程部署
整理一下 jupyter notebook 的各种使用方式。 本地部署直接在本地主机上启动 jupyter notebook 服务是最简单的用法 1jupyter notebook 需要说明的是: jupyter 服务默认监听本机的 8888 端口,如果本机的 8888 端口已经被占用,在启动时会自动递增,改为 8889 端口等,也可以使用 --port 选项指定端口; jupyter 在启动时会尝试打开本地浏览器,或者手动通过 http://localhost:8888/ 访问即可,可以加上选项阻止自动开启浏览器 --no-browser; 默认只允许接收来自 localhost 的请求,可以使用 --ip 选项指定,例如--ip=0.0.0.0 代表允许所有的 ip 访问; 默认的工作目录是执行命令时所处的目录,可以在后面加上工作目录作为位置参数,例如 jupyter notebook /path/to/notebooks,还可以使用 --notebook-dir 选项指定,例如 --notebook-dir=/path/to/notebooks。 除了直接在前台运行,...
Python 包下载和虚拟环境管理
包括两部分: pip:包下载安装 venv:虚拟环境管理 在部分 Linux 发行版(例如 Ubuntu)中即使系统自带 Python,也可能只是包括了最基础的功能,并不包括 pip 和 venv,需要单独下载安装 1sudo apt-get install python3-pip python3-venv 这些内容在不同的系统(Windows/Linux)中的实现细节各有不同,在不同的 shell(pwsh/bash/fish)中,对应的脚本实现也有差异,下面以 Linux + bash 为主,也会考虑 Windows + pwsh 的情况。 pip基本使用使用 pip 可以安装 Python 包,常见形式为 1pip install <package_name> 例如安装进度条 tqdm 1pip install tqdm pip 会自动处理包的版本要求和依赖关系,依赖关系在不同系统下可能存在差异,例如: 在 Linux 上只会安装 tqdm 自身; 在 Windows 上会自动安装两个包:colorama, tqdm,前...
星期算法
学习一下如何根据指定的年月日快速计算星期几,由于公历的规律性很强,将所有规律整理并不断简化就可以得到这种简便算法,有很多不同的变形算法,例如蔡勒公式,康威裁决日算法等,本文主要学习蔡勒公式。 公历简要回顾一下公历:每年12个月,每个月可能有28、29、30、31天。区分普通的年和闰年,非闰年有365天,闰年有366天,年份满足以下情况时为闰年: 年份除以100的余数不为0,除以4的余数为0 年份除以100的余数为0,并且除以400的余数为0 非闰年的12个月的天数依次为: 28天:2月 30天:4月、6月、9月、11月 31天:1月、3月、5月、7月、8月、10月、12月 闰年的12个月的天数依次为: 29天:2月 30天:4月、6月、9月、11月 31天:1月、3月、5月、7月、8月、10月、12月 由于公历于1582年10月正式建立,在这段时间以及更早的年份可能存在日期修正,细节比较复杂,不作讨论。 蔡勒公式公式如下$$w = \left( y + \left[ \frac{y}4 \right] + \left[ \frac{c}4 \ri...
Docker 入门笔记
简单学习一下 Docker。 基本概念Docker 是一种轻量级的容器化技术,与传统虚拟机相比,它更加高效,能够快速部署和运行应用程序。传统虚拟机需要完整的操作系统,每个虚拟机通常占用多个 GB,而 Docker 容器共享宿主机内核,镜像通常只有 MB 级别,占用更少的资源,启动速度更快。 首先需要区分 Docker 的两个核心概念: Docker Image(镜像):Docker 镜像是一个只读的模板(实质是宿主系统中的一个文件),包含了运行应用程序所需的所有文件和环境(包括代码、运行时、依赖项、系统工具等)。镜像可以被用来创建容器,基于一个镜像可以创建多个容器。 Docker Container(容器):容器是基于镜像创建的运行实例(实质是宿主系统中的一个进程),它提供了一个隔离的轻量级 Linux 环境,可以在其中独立运行应用程序。 容器可以被创建、启动、暂停、停止、删除等,多个容器可以在同一个主机上运行,并且它们彼此之间是相互隔离的。容器在运行过程中产生的更改通常不会影响外部系统(除非使用专门的方式,包括数据卷和绑定宿主目录等),更不会影响镜像文件。 镜像的构造过程...
Github worktree 学习笔记
简单记录一下 git worktree 的用法。worktree 允许在同一个本地仓库中同时拥有多个工作目录,每个工作目录可以对应不同的分支或提交。非常适合并行开发、快速切换上下文或测试。 为什么需要 worktree?在传统的 git 使用中,一个本地仓库只有一个工作目录(即你当前检出的分支)。如果你需要同时处理两个不同的分支,通常的做法是: 克隆多个仓库,可以按需要分别对应不同分支,但这样会浪费空间且难以同步。 暂存当前工作,切换到另一个分支,完成工作后再切换回来,但是 stash 也可能有残留文件,而且切换可能出现问题。 worktree 解决了这个问题:它允许你为同一个仓库创建额外的工作目录,每个工作目录都有自己的实际文件夹、索引和 HEAD,它们共享同一个仓库的对象数据库和引用(refs)。 worktree 原理Git 默认将数据检出到一个工作目录(即仓库的根目录),对于裸仓库,则不会检出。而 worktree 提供了检出多个工作目录的选择,并且这些工作目录之间共享同一个 Git 仓库的数据库和引用(refs)。具体地说: 多个工作目录共享同一个 .git/ 目...
