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