python 学习记录 链接到标题
1. 类 链接到标题
继承
class GaussianRasterizationSettings(NamedTuple):
构造函数
def __init__(self,)
public和private属性
self._raster_settings = raster_settings # private self.raster_settings = raster_settings # public def _get_raster_settings(self): # private def get_raster_settings(self): # public
元类:用于创建类的类,决定了一个类如何被构造。
# 元类(metaclass) = NamedTupleMeta class NamedTuple(metaclass=NamedTupleMeta):
创建实例特殊方法
class MyClass: def __new__(cls, *args, **kwargs): print("__new__ 被调用") instance = super().__new__(cls) # 调用父类 type 的 __new__ return instance def __init__(self, value): print("__init__ 被调用") self.value = value obj = MyClass(42) ### output: __new__ 被调用 __init__ 被调用
@property:装饰器,用于将类内函数变成属性,使得调用时不需要加 (),就像访问普通变量一样。
2. 变量 链接到标题
- 未赋值
a = None
3. 函数 链接到标题
.format()
print("Output folder: {}".format(args.model_path)) print("Model: {}, Epochs: {}".format("ResNet", 50))
vars(): 获取对象的属性字典
range(): 生成整数序列
# 生成从 start 到 stop 的整数序列,步长为 step。 range(start, stop, step)
for
# 遍历 cam_extrinsics 字典,并同时获取索引 idx 和键 key。 for idx, key in enumerate(cam_extrinsics):
with open () as file:
# with: 自动管理文件的打开和关闭,避免资源泄露
# os.path.join(self.model_path, "cameras.json"): 如果路径不存在,则创建一个名为 cameras.json 的文件,并写入 json_cams 的内容。
# w: 写入 / r: 读取 / wb: 二进制写入 / rb: 二进制读取
# json.dump(json_cams, file): 将 json_cams 中的内容写入到 file 中。
with open(os.path.join(self.model_path, "cameras.json"), 'w') as file:
json.dump(json_cams, file)
if isinstance(v, dict): 判断 v 是否为字典类型
current_datetime = datetime.now().strftime("%Y-%m-%d-%H-%M-%S"): 获取当前时间,并格式化为 “%Y-%m-%d-%H-%M-%S” 的字符串。
tmp = tmp.split(".")[0]:将字符串 tmp 按照点 (.) 分割,并获取分割后的第一个部分。
'/workspace/MonoGS/configs/mono/tum/fr3_office.yaml' 变成 '/workspace/MonoGS/configs/mono/tum/fr3_office'
4. 符号 链接到标题
- *= : 乘法赋值
a *= 2 #等价于 a = a * 2
- **: 幂运算
0.1 ** 2 # 等价于 0.1 * 0.1
- ~: 取反,一般用在bool掩码变量上
- @: 矩阵乘法
5. 库 链接到标题
5.1 pytorch 链接到标题
- torch.save(obj, file_path): 保存模型obj到路径file_path
- torch.cuda() == torch.to(“cuda”)
- torch.cuda.empty_cache():清空缓存
- torch.squeeze(): 删除维度
- torch.data.fill_(x): 将张量中的所有元素填充为x
- torch.median(): 计算张量中所有维度元素的中位数,并返回标量,如果元素数是偶数则返回2个中位数的均值,
- torch.unsqueeze(): 增加维度
image = torch.randn(3, 224, 224) # 创建一个形状为 (3, 224, 224) 的张量
image = image.unsqueeze(0) # 在第 0 维添加一个新的维度
print(image.shape) # 输出: torch.Size([1, 3, 224, 224])
- .item(): 获取张量中的标量值并返回float
import torch
loss = torch.tensor(2.5) # 0 维张量
print(loss.item()) # 输出:2.5
- .max(): 返回张量中的最大值和索引
import torch
a = torch.tensor([1, 2, 3])
b = torch.tensor([3, 1, 2])
result = torch.max(a, b)
print(result) # 输出: tensor([3, 2, 3])
- .norm(): 计算张量范数
# 计算 viewspace_point_tensor.grad 在 update_filter 选定的元素中的前两个维度,并计算最后一个维度的 L2 范数,并保持原来的维度。
torch.norm(viewspace_point_tensor.grad[update_filter, :2], dim=-1, keepdim=True)
# 示例
import torch
# 生成假设的梯度张量 (5, 3)
viewspace_point_tensor_grad = torch.tensor([
[3.0, 4.0, 5.0], # 行索引 0
[1.0, 2.0, 3.0], # 行索引 1
[0.5, 0.5, 0.5], # 行索引 2
[4.0, 3.0, 2.0], # 行索引 3
[6.0, 8.0, 10.0] # 行索引 4
])
# 选择部分索引(比如选择 0, 2, 4 这三行)
update_filter = torch.tensor([0, 2, 4])
# 取出选中的行,并截取前两列
selected_grad = viewspace_point_tensor_grad[update_filter, :2]
print("Selected Gradients:\n", selected_grad)
# 计算 L2 范数
norm_result = torch.norm(selected_grad, dim=-1, keepdim=True)
print("Norm Result:\n", norm_result)
# 输出
Selected Gradients:
tensor([[3.0000, 4.0000],
[0.5000, 0.5000],
[6.0000, 8.0000]])
Norm Result:
tensor([[5.0000],
[0.7071],
[10.0000]])
- .step(): 更新优化器的学习率
# 更新优化器的学习率
gaussians.exposure_optimizer.step()
- torch.where(input,true,false): 返回满足条件的索引
- torch.zero_grad(): 清空梯度
- torch.set_detect_anomaly(): 设置是否检测异常
- torch.logical_and(a,b): 逻辑与,即满足条件a和b的索引
- torch.repeat(dim0,dim1,…,dimN):沿着第 0 维复制 dim0 次,沿着第 1 维复制 dim1 次(其中1等于没复制)。
- torch.tensor(): 将输入转换为张量
- torch.permute(input,dims): 对张量进行维度变换
- torch.tensor().grad(): 获取张量中的梯度
- torch.tensor().isnan(): 判断张量中是否有NaN值
- torch.from_numpy(): 将numpy数组转换为张量
- torch.zeros(): 生成全零张量
- torch.zeros_like(): 生成与输入张量形状相同的全零张量
- torch.ones(): 生成全一张量
- torch.randn_like(x): 生成与输入张量形状相同的随机正态分布张量,范围一般是(-3,3)
- torch.clamp(input,min,max): 数值限制,保证取值如果大于max,则取max,如果小于min,则取min
- torch.clamp_min(input,min): 数值限制,保证取值不小于min。input>min,则取input,否则取min
- torch.mean(): 计算张量平均值
- torch.mean(dim=0,keepdim=True): 计算张量第一维度的平均值,并保持原始维度
- torch.nn.Parameter(): 将输入转换为可训练参数
- torch.eye(): 生成单位矩阵
- torch.contiguous():确保张量在内存中是连续的
- torch[…,None] == torch.unsqueeze(-1),新增一个维度
- torch.rand(): 生成随机数
# 生成一个形状为(3,)的随机数tensor,且值在0到1之间 test = torch.rand(3)
- torch.stack(): 堆叠张量
- torch.abs(a).sum(): 计算张量a绝对值之和,得到一个数值
- torch.transpose(): 二维-矩阵转置 / 三维及以上-维度置换
- torch.cat(): 拼接张量
# dim=0 → 在行方向拼接 # dim=1 → 在列方向拼接 torch.cat((tensor1, tensor2, ...), dim)
5.2 socket 链接到标题
5.3 numpy 链接到标题
- np.clip() : 限制数值范围
# 计算 step 在 max_steps 之间的进度(归一化处理),使其值在 0 到 1 之间
t = np.clip(step / max_steps, 0, 1)
- np.log(): 计算对数
- np.exp(): 计算指数函数
- np.array(Image.open(color_path)): 将输入xxx(如图像)转换为 numpy 数组
- np.transpose(): 转置矩阵
- np.hstack(): 水平拼接矩阵
- np.vstack(): 垂直拼接矩阵
- np.flatten(): 将多维数组拉平为一维数组
- np.linalg.norm(): 计算向量的L2 范数,即模长
- np.linalg.inv(): 计算矩阵的逆矩阵
- np.asarray(): 将输入转换为 numpy 数组
- np.argmin(): 返回最小值的索引
- np.roll(a,1):把a的最后一个元素移到最前面
- np.astype(xxx): 将输入转换为指定类型xxx
5.4 os 链接到标题
os.getenv(): 获取环境变量
os.path.join(): 拼接路径
path = os.path.join("HOME", "test") print(path) # 输出:/HOME/test
os.path.exists(): 判断路径是否存在
if os.path.exists(os.path.join(args.source_path, "sparse")): print("sparse folder exists")
Image( id=30, qvec=array([ 0.99594658, 0.04321676, -0.07542195, 0.02311393]), tvec=array([-3.26441913, -0.18824842, 2.00088495]), camera_id=1, name=‘00030.jpeg’, xys=array([[550.90352136, 7.60615692], [528.6300753 , 41.42015624], [588.32130018, 47.0929698 ], …, [302.97620595, 366.21732777], [ 44.8081433 , 553.1233508 ], [558.25662663, 509.63862292]]), point3D_ids=array([ -1, -1, -1, …, 3763, -1, -1]))
5.5 json 链接到标题
- json.dump(a,file): 将 a 序列化为 JSON 格式的字符串,并写入到文件file中。
5.6 random 链接到标题
- random.shuffle(a): 将列表(list)a中的元素随机打乱。
- random.randint(a,b): 返回一个随机整数,范围从a到b(包括a和b)。
5.7 PIL 链接到标题
- PIL.Image.open(path): 打开图片,返回一个Image对象。
image = PIL.Image.open(path)
5.8 opencv : 图像处理 链接到标题
- cv2.imread(path): 读取图片,返回一个numpy数组。
- map1,map2 = cv2.initUndistortRectifyMap(cameraMatrix, distCoeffs, R, newCameraMatrix, size, m1type): 初始化映射
- image = cv2.remap(image, map1, map2, interpolation=cv2.INTER_LINEAR): 得到去畸变后的图像。和initUndistortRectifyMap搭配使用。
5.9 yaml 链接到标题
- output = yaml.full_load(f): 读取yaml文件,返回一个字典。
5.10 rich 链接到标题
- rich.print(a): 打印a,支持颜色、格式化等。
5.11 munch 链接到标题
- b = muchify(a): 将字典a转换为munch对象b,支持点式访问。
5.12 trimesh 链接到标题
- T = trimesh.transformations.quaternion_matrix(np.roll(quat, 1)): 创建旋转矩阵
5.13 multiprocessing : 进程处理 链接到标题
- multiprocessing.Queue(): 创建一个队列,用于在多个进程之间交换数据。
- multiprocessing.Queue.put(item): 在队尾中添加一个元素。
- multiprocessing.Queue.get(): 从队头中取出一个元素。
- multiprocessing.Queue.empty(): 判断队列是否为空。
- multiprocessing.Process(): 创建一个进程,用于在多个进程中执行任务。
- multiprocessing.start(): 启动子进程(开启新进程)。
- multiprocessing.run(): 在主进程内运行子进程(不开启新进程)。
5.14 open3d : 图像生成3D点云 链接到标题
- o3d.geometry.Image(xxx):封装图像xxx为3D点云
- o3d.geometry.RGBDImage.create_from_color_and_depth(xxx):rgb图像 + 深度图像 => RGBD 图像
- o3d.geometry.PointCloud.create_from_rgbd_image(xxx):RGBD 图像 => 点云
6. 数据结构 链接到标题
6.1 列表 [] 链接到标题
- 特性: 可修改 / 可重复 / 有序
- 示例:
my_list = [1, 2, 3, 4, 5] print(type(my_list)) # <class 'list'>
- 用法:
a = [] b = [1, 2, 3] a.append(1) # 添加元素 a.extend(b) # 扩展列表 c = len(a) # 获取长度 d = a.pop(0) # 删除并返回指定索引的元素 e = b[-1] # e = 3
6.2 字典 链接到标题
- 其他表达:dict()
- 特性: 可修改 / 无序 / 键唯一
- 示例:
my_dict = {"name": "Alice", "age": 25, "city": "New York"} print(my_dict["name"]) # Alice
6.3 元组 () 链接到标题
- 特性: 不可修改 / 可重复 / 有序
- 示例:
my_tuple = (1, 2, 3, 4, 5) print(type(my_tuple)) # <class 'tuple'>
6.4 数组 [] 链接到标题
- 特性: 数值计算 / 元素类型相同 / 有序
- 示例:
import numpy as np vector1 = np.array([[-6.1033707, -0.8284, 2.981597]]) print(vector1.shape) # (1, 3) vector2 = np.array([[-6.1033707], [-0.8284], [2.981597]]) print(vector2.shape) # (3, 1)
7. 切片 链接到标题
- 张量切片语法:
features[start_dim1:end_dim1, start_dim2:end_dim2, start_dim3:end_dim3] features[:, :, 0:1] # 第一维所有元素 # 第二维所有元素 # 第三维取索引0到1,左闭右开,实际只取0 # todo