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

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.28 存储之道:跨平台数据持久化方案

在这里插入图片描述
好的,我将按照您的要求生成一篇高质量的Python NumPy文章。以下是第28篇《存储之道:跨平台数据持久化方案》的完整内容,包括目录、正文和参考文献。

1.28 存储之道:跨平台数据持久化方案

目录
存储之道:跨平台数据持久化方案
1.28.1 HDF5格式的层次化存储
1.28.1.1 HDF5基础概念
1.28.1.2 HDF5的层次化数据模型
1.28.1.3 HDF5的读写操作
1.28.1.4 HDF5元数据管理技巧
1.28.2 云存储的断点续传实现
1.28.2.1 云存储概述
1.28.2.2 阿里云OSS存储集成
1.28.2.3 断点续传的实现原理
1.28.2.4 断点续传的代码示例
1.28.3 数据版本控制方案设计
1.28.3.1 数据版本控制的重要性
1.28.3.2 DVC版本控制系统整合
1.28.3.3 数据版本控制的实践案例
1.28.4 内存数据库集成实践
1.28.4.1 内存数据库概述
1.28.4.2 Redis缓存加速方案
1.28.4.3 Redis与NumPy的集成示例
1.28.5 数据校验和计算方法
1.28.5.1 数据校验的重要性和常见方法
1.28.5.2 使用NumPy进行数据校验
1.28.5.3 校验和计算方法
1.28.5.4 常见的数据校验应用场景
存储之道:跨平台数据持久化方案] --> B[HDF5层次化存储
云存储断点续传
数据版本控制
内存数据库集成
B
元数据管理
数据压缩
并行读写
分块上传
进度跟踪
错误恢复
DVC工作流
差异存储
版本回退
Redis缓存
数据结构优化
持久化策略
1.28.1 HDF5格式的层次化存储
元数据管理架构
1
*
HDF5File
+root_group: Group
+create_dataset()
+add_attribute()
+read_metadata()
Dataset
+data: ndarray
+attrs: dict
+compression: str
代码实现
import h5py
import numpy as np
from datetime import datetime# 创建HDF5文件并添加元数据
with h5py.File('experiment.h5', 'w') as f:# 创建根组属性f.attrs['experiment_name'] = "纳米材料分析"f.attrs['create_time'] = datetime.now().isoformat()# 创建数据集temp_data = np.random.rand(1000, 1000).astype(np.float32)dset = f.create_dataset('/measurements/temperature', data=temp_data,compression='gzip', compression_opts=9)# 添加数据集元数据dset.attrs['unit'] = '摄氏度'dset.attrs['sensor_id'] = 'TC-2023A'dset.attrs['calibration_date'] = '2023-08-15'# 读取元数据示例
with h5py.File('experiment.h5', 'r') as f:print(f"实验名称: {f.attrs['experiment_name']}")dset = f['/measurements/temperature']print(f"数据维度: {dset.shape} 压缩算法: {dset.compression}")

1.28.1.1 HDF5基础概念

HDF5(Hierarchical Data Format 5)是一种用于存储和管理大规模科学数据的文件格式。它支持多种数据类型,包括数组、表格、时间序列等,广泛应用于科学计算、大数据处理等领域。

  • HDF5文件结构:HDF5文件采用层次化结构,类似文件系统中的目录和文件。每个文件可以包含多个数据集(datasets)和组(groups),组可以嵌套多个子组和数据集。
  • 数据集:数据集是HDF5文件中的主要数据存储单元,可以存储多维数组。
  • :组用于组织和管理多个数据集和其他组,类似于文件系统中的文件夹。
1.28.1.2 HDF5的层次化数据模型

HDF5的层次化数据模型使其非常适合存储复杂的数据结构。以下是HDF5文件的基本层次化模型:

HDF5文件
组1
数据集1.1
数据集1.2
组2
组2.1
数据集2.1.1
数据集2.1.2
数据集2.2
组3
数据集3.1
数据集3.2
数据集3.3
  • 层次化结构:每个组可以包含多个数据集和其他子组,形成树状结构。
  • 数据集:数据集是实际存储数据的单元,可以是多维数组或表格。
  • 属性:每个数据集和组可以有自己的属性,用于存储元数据。
1.28.1.3 HDF5的读写操作

HDF5文件的读写操作可以通过Python的h5py库实现。以下是基本的读写操作示例:

import h5py
import numpy as np# 创建HDF5文件
with h5py.File('example.h5', 'w') as f:# 创建组group1 = f.create_group('group1')  # 创建组1group2 = f.create_group('group2')  # 创建组2# 创建数据集dataset1 = group1.create_dataset('dataset1', (100, 100), dtype='i')  # 在组1中创建数据集1,100x100的整数数组dataset2 = group2.create_dataset('dataset2', (50, 50), dtype='f')  # 在组2中创建数据集2,50x50的浮点数组# 写入数据dataset1[:] = np.random.randint(0, 100, size=(100, 100))  # 写入随机整数dataset2[:] = np.random.randn(50, 50)  # 写入随机浮点数# 读取HDF5文件
with h5py.File('example.h5', 'r') as f:# 读取数据data1 = f['group1/dataset1'][:]  # 读取组1中的数据集1data2 = f['group2/dataset2'][:]  # 读取组2中的数据集2# 打印数据print(data1)  # 打印数据集1的内容print(data2)  # 打印数据集2的内容
  • 创建文件:使用h5py.File创建HDF5文件,模式可以是'w'(写模式)、'r'(读模式)或'a'(追加模式)。
  • 创建组:使用create_group方法创建组。
  • 创建数据集:使用create_dataset方法在组中创建数据集。
  • 写入数据:使用切片操作[:]将数据写入数据集。
  • 读取数据:使用'/'路径符访问数据集,读取数据。
1.28.1.4 HDF5元数据管理技巧

元数据是描述数据集的附加信息,例如数据集的创建时间、描述、单位等。在HDF5文件中,可以使用属性(attributes)来存储元数据。

import h5py
import numpy as np# 创建HDF5文件
with h5py.File('example.h5', 'w') as f:# 创建组group1 = f.create_group('group1')# 创建数据集dataset1 = group1.create_dataset('dataset1', (100, 100), dtype='i')# 写入数据dataset1[:] = np.random.randint(0, 100, size=(100, 100))# 添加元数据dataset1.attrs['created_on'] = '2023-10-01'  # 创建时间dataset1.attrs['description'] = 'Random integers'  # 描述dataset1.attrs['unit'] = 'counts'  # 单位# 读取HDF5文件
with h5py.File('example.h5', 'r') as f:dataset1 = f['group1/dataset1']# 读取元数据created_on = dataset1.attrs['created_on']description = dataset1.attrs['description']unit = dataset1.attrs['unit']# 打印元数据print(f"创建时间: {created_on}")print(f"描述: {description}")print(f"单位: {unit}")
  • 添加元数据:使用attrs属性字典来添加元数据。
  • 读取元数据:同样使用attrs属性字典来读取元数据。

1.28.2 云存储的断点续传实现

分块上传流程
Client OSS 初始化分块上传 切割文件为5MB块 上传分块(带MD5校验) 返回分块ETag loop [分块处理] 提交完整文件 返回最终ETag Client OSS
断点续传实现
import oss2
import hashlib
import osclass ResumeUploader:def __init__(self, access_key, secret_key, endpoint, bucket_name):auth = oss2.Auth(access_key, secret_key)self.bucket = oss2.Bucket(auth, endpoint, bucket_name)self.part_size = 5 * 1024 * 1024  # 5MB分块def _calc_md5(self, data):"""计算数据块的MD5校验值"""md5 = hashlib.md5()md5.update(data)return md5.hexdigest()def upload(self, object_name, file_path):file_size = os.path.getsize(file_path)upload_id = self.bucket.init_multipart_upload(object_name).upload_idparts = []with open(file_path, 'rb') as f:part_number = 1offset = 0while offset < file_size:# 读取分块数据data = f.read(self.part_size)md5 = self._calc_md5(data)# 上传分块result = self.bucket.upload_part(object_name, upload_id, part_number, data)parts.append(oss2.models.PartInfo(part_number, result.etag, md5=md5))print(f"已上传分块 {part_number}/{file_size//self.part_size+1}")part_number += 1offset += len(data)# 完成上传self.bucket.complete_multipart_upload(object_name, upload_id, parts)print(f"文件 {object_name} 上传完成")# 使用示例
uploader = ResumeUploader('your_access_key', 'your_secret_key','oss-cn-hangzhou.aliyuncs.com','data-bucket'
)
uploader.upload('large_dataset.npy', '/data/scientific_data.npy')

1.28.2.1 云存储概述

云存储是将数据存储在远程服务器上,并通过网络访问和管理。常见的云存储服务提供商包括阿里云OSS、Amazon S3、Google Cloud Storage等。

  • 优点:高可用性、可扩展性、成本效益。
  • 应用场景:大数据处理、数据备份、内容分发等。
1.28.2.2 阿里云OSS存储集成

阿里云对象存储服务(OSS)提供了一种简单、可靠、安全的云存储解决方案。以下是使用Python SDK集成阿里云OSS的基本步骤:

  1. 安装阿里云OSS SDK

    pip install oss2
    
  2. 初始化OSS客户端

    import oss2# 初始化OSS客户端
    auth = oss2.Auth('your-access-key-id', 'your-access-key-secret')  # 替换为您的Access Key ID和Secret
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'your-bucket-name')  # 替换为您的Bucket名称和区域
    
  3. 上传和下载文件

    # 上传文件
    bucket.put_object_from_file('example.h5', 'local_path/example.h5')  # 从本地路径上传文件# 下载文件
    bucket.get_object_to_file('example.h5', 'local_path/example.h5')  # 从OSS下载文件到本地路径
    
  • 初始化客户端:使用oss2.Authoss2.Bucket初始化客户端。
  • 上传文件:使用put_object_from_file方法将本地文件上传到OSS。
  • 下载文件:使用get_object_to_file方法将OSS文件下载到本地。
1.28.2.3 断点续传的实现原理

断点续传是指在文件传输过程中,如果传输中断,可以从上次中断的地方继续传输,而不是重新开始。其实现原理如下:

  1. 分块上传:将大文件分割成多个小块,逐块上传。
  2. 记录上传状态:在每块上传完成后,记录当前块的上传状态。
  3. 恢复上传:在传输中断后,读取上次的上传状态,从断点处继续传输。
1.28.2.4 断点续传的代码示例

以下是使用阿里云OSS SDK实现断点续传的代码示例:

import oss2def upload_with_resume(bucket, object_key, local_file, part_size=1 * 1024 * 1024):"""实现断点续传上传:param bucket: OSS客户端:param object_key: 对象键:param local_file: 本地文件路径:param part_size: 分块大小,默认1MB"""# 获取文件大小file_size = os.path.getsize(local_file)# 初始化分块上传upload_id = bucket.init_multipart_upload(object_key).upload_id# 读取上传状态parts = bucket.list_parts(object_key, upload_id)uploaded_parts = {part.part_number: part.etag for part in parts.parts}# 分块上传with open(local_file, 'rb') as file:for i in range(1, int(np.ceil(file_size / part_size)) + 1):if i in uploaded_parts:print(f"跳过已上传的部分: {i}")continuestart = (i - 1) * part_sizeend = min(start + part_size, file_size)part_data = file.read(part_size)result = bucket.upload_part(object_key, upload_id, i, part_data)uploaded_parts[i] = result.etag# 完成分块上传oss2.complete_multipart_upload(bucket, object_key, upload_id, uploaded_parts)# 初始化OSS客户端
auth = oss2.Auth('your-access-key-id', 'your-access-key-secret')
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'your-bucket-name')# 上传文件
upload_with_resume(bucket, 'example.h5', 'local_path/example.h5')
  • 初始化分块上传:使用init_multipart_upload方法初始化分块上传,获取upload_id
  • 读取上传状态:使用list_parts方法获取已上传的块信息。
  • 分块上传:逐块上传文件,跳过已上传的部分。
  • 完成分块上传:使用complete_multipart_upload方法完成上传。

1.28.3 数据版本控制方案设计

DVC工作流架构
原始数据
DVC跟踪
元数据存储
版本更新
差异同步
云存储
代码示例
import subprocess
import jsonclass DVCManager:def __init__(self, repo_path):self.repo_path = repo_pathdef init_repo(self):"""初始化DVC仓库"""subprocess.run(['dvc', 'init'], cwd=self.repo_path)print("DVC仓库已初始化")def track_data(self, data_path):"""添加数据追踪"""subprocess.run(['dvc', 'add', data_path], cwd=self.repo_path)print(f"已开始追踪 {data_path}")def commit_version(self, message):"""提交数据版本"""subprocess.run(['git', 'add', '*.dvc'], cwd=self.repo_path)subprocess.run(['git', 'commit', '-m', message], cwd=self.repo_path)print(f"版本已提交: {message}")def push_data(self):"""推送数据到远程存储"""subprocess.run(['dvc', 'push'], cwd=self.repo_path)print("数据已推送到远程存储")def show_history(self):"""显示版本历史"""result = subprocess.run(['dvc', 'dag'], cwd=self.repo_path, capture_output=True)print(result.stdout.decode())# 使用示例
manager = DVCManager('/project/data')
manager.init_repo()
manager.track_data('raw_dataset.csv')
manager.commit_version("添加初始数据集")
manager.push_data()

1.28.3.1 数据版本控制的重要性

数据版本控制是指对数据的多个版本进行管理和记录,以便在需要时能够回溯到特定的版本。这对于数据科学项目尤其重要,可以确保数据的可追溯性和可复现性。

  • 版本控制的优势:数据追溯、协同工作、数据复现。
  • 常见的版本控制系统:DVC(Data Version Control)、Git LFS(Large File Storage)等。
1.28.3.2 DVC版本控制系统整合

DVC是一个专门用于数据版本控制的开源工具,可以与Git结合使用,管理大型数据文件和模型。

  1. 安装DVC

    pip install dvc
    
  2. 初始化DVC项目

    dvc init
    
  3. 添加数据文件

    dvc add example.h5
    
  4. 提交版本

    git add .dvc
    git add example.h5.dvc
    git commit -m "Add example.h5"
    
  5. 回溯版本

    git checkout <commit-hash>
    dvc checkout
    
  • 初始化项目:使用dvc init初始化DVC项目。
  • 添加数据文件:使用dvc add将数据文件添加到DVC管理。
  • 提交版本:使用Git管理DVC的元数据文件。
  • 回溯版本:使用Git和DVC回溯到特定的版本。
1.28.3.3 数据版本控制的实践案例

假设我们有一个数据集example.h5,我们需要在多个版本中管理这个数据集。以下是具体的实践步骤:

  1. 初始化DVC和Git

    dvc init
    git init
    
  2. 添加初始数据

    dvc add example.h5
    git add .dvc
    git add example.h5.dvc
    git commit -m "Initial version of example.h5"
    
  3. 修改数据并提交新版本

    import h5py
    import numpy as np# 修改数据
    with h5py.File('example.h5', 'a') as f:dataset1 = f['group1/dataset1']dataset1[:] = np.random.randint(0, 200, size=(100, 100))  # 修改数据集1的内容# 添加新版本
    !dvc add example.h5
    !git add .dvc
    !git add example.h5.dvc
    !git commit -m "Modified version of example.h5"
    
  4. 回溯到初始版本

    git checkout <initial-commit-hash>
    dvc checkout
    
  • 初始化DVC和Git:在项目中同时初始化DVC和Git。
  • 添加初始数据:将初始数据文件添加到DVC管理并提交Git版本。
  • 修改数据并提交新版本:修改数据文件并提交新版本。
  • 回溯到初始版本:使用Git和DVC回溯到初始版本。

1.28.4 内存数据库集成实践

Redis缓存架构
命中
未命中
应用请求
Redis查询
返回缓存数据
数据库查询
缓存结果
代码实现
import redis
import numpy as np
import pickle
import hashlibclass NumpyCache:def __init__(self, host='localhost', port=6379, db=0):self.pool = redis.ConnectionPool(host=host, port=port, db=db)self.client = redis.Redis(connection_pool=self.pool)def _get_key(self, func_name, args):"""生成唯一缓存键"""arg_hash = hashlib.sha256(pickle.dumps(args)).hexdigest()return f"np:{func_name}:{arg_hash}"def cached(self, func):"""装饰器实现缓存功能"""def wrapper(*args):key = self._get_key(func.__name__, args)cached_data = self.client.get(key)if cached_data:print(f"命中缓存 {key}")return pickle.loads(cached_data)else:result = func(*args)self.client.setex(key, 3600, pickle.dumps(result))  # 缓存1小时print(f"缓存新数据 {key}")return resultreturn wrapper# 使用示例
cache = NumpyCache()@cache.cached
def compute_matrix(n):"""耗时计算的矩阵生成函数"""print("执行复杂计算...")return np.random.rand(n, n) @ np.random.rand(n, n)# 第一次调用执行计算
result1 = compute_matrix(1000)  
# 第二次调用命中缓存
result2 = compute_matrix(1000)  

1.28.4.2 Redis缓存加速方案
  1. 连接Redis服务器

    import redis# 连接Redis服务器
    r = redis.Redis(host='localhost', port=6379, db=0)  # 连接到本地的Redis服务器
    
  2. 缓存NumPy数组

    • 将NumPy数组转换为字节

      import numpy as np
      import pickle# 生成NumPy数组
      data = np.random.randint(0, 100, size=(100, 100))# 将NumPy数组序列化为字节
      serialized_data = pickle.dumps(data)
      
    • 将字节数据存储到Redis

      # 存储到Redis
      r.set('numpy_data', serialized_data)
      
    • 从Redis读取并反序列化数据

      # 从Redis读取字节数据
      serialized_data = r.get('numpy_data')# 反序列化为NumPy数组
      data = pickle.loads(serialized_data)# 打印数据
      print(data)
      
  • 连接服务器:使用redis.Redis连接到Redis服务器。
  • 缓存数据:将NumPy数组序列化为字节并存储到Redis。
  • 读取数据:从Redis读取字节数据并反序列化为NumPy数组。
1.28.4.3 Redis与NumPy的集成示例

以下是一个完整的示例,展示如何在数据处理过程中使用Redis缓存NumPy数组:

import redis
import numpy as np
import pickle
import time# 连接Redis服务器
r = redis.Redis(host='localhost', port=6379, db=0)# 生成NumPy数组
data = np.random.randint(0, 100, size=(1000, 1000))# 将NumPy数组序列化为字节
serialized_data = pickle.dumps(data)# 记录当前时间
start_time = time.time()# 存储到Redis
r.set('numpy_data', serialized_data)# 从Redis读取字节数据
serialized_data = r.get('numpy_data')# 反序列化为NumPy数组
data = pickle.loads(serialized_data)# 记录结束时间
end_time = time.time()# 计算缓存读写时间
cache_time = end_time - start_time# 直接读写NumPy数组的时间
start_time = time.time()
data = np.random.randint(0, 100, size=(1000, 1000))
end_time = time.time()
direct_time = end_time - start_time# 比较缓存读写时间和直接读写时间
print(f"缓存读写时间: {cache_time}秒")
print(f"直接读写时间: {direct_time}秒")
  • 连接服务器:使用redis.Redis连接到Redis服务器。
  • 生成数据:生成一个1000x1000的随机整数数组。
  • 序列化数据:将NumPy数组序列化为字节。
  • 存储和读取:将数据存入Redis并读取。
  • 时间比较:比较使用Redis缓存和直接读写NumPy数组的时间。

1.28.5 数据校验和计算方法

校验和验证流程
Client Server 上传数据(带校验和) 计算接收数据校验和 确认接收成功 请求重新发送 alt [校验匹配] [校验失败] Client Server
校验算法实现
import hashlib
import numpy as npclass DataIntegrity:@staticmethoddef array_checksum(arr):"""计算Numpy数组的校验和"""# 将数组转换为字节流buffer = arr.tobytes()# 计算SHA256哈希值sha = hashlib.sha256()sha.update(buffer)return sha.hexdigest()@staticmethoddef verify_data(data, expected_hash):"""验证数据完整性"""current_hash = DataIntegrity.array_checksum(data)if current_hash == expected_hash:print("数据完整性验证通过")return Trueelse:print(f"校验失败!期望值: {expected_hash}\n实际值: {current_hash}")return False# 使用示例
original_data = np.random.rand(100, 100)
checksum = DataIntegrity.array_checksum(original_data)# 模拟传输过程
transmitted_data = original_data.copy()
transmitted_data[50,50] += 0.001  # 模拟数据损坏DataIntegrity.verify_data(transmitted_data, checksum)

1.28.5.1 数据校验的重要性和常见方法

数据校验是指在数据传输或存储过程中确保数据的完整性和一致性。常见的数据校验方法包括:

  • 校验和:计算数据的校验和,常用的方法有MD5、SHA-1等。
  • 校验码:使用校验码(如CRC32)进行校验。
  • 数据签名:使用数字签名技术确保数据来源的可信性。
1.28.5.2 使用NumPy进行数据校验

NumPy提供了多种数学函数,可以用于计算校验和。以下是使用NumPy计算校验和的示例:

  1. 计算MD5校验和

    import hashlib
    import numpy as np# 生成NumPy数组
    data = np.random.randint(0, 100, size=(100, 100))# 将NumPy数组转换为字节
    data_bytes = data.tobytes()# 计算MD5校验和
    md5_checksum = hashlib.md5(data_bytes).hexdigest()# 打印MD5校验和
    print(f"MD5校验和: {md5_checksum}")
    
  2. 计算SHA-1校验和

    # 计算SHA-1校验和
    sha1_checksum = hashlib.sha1(data_bytes).hexdigest()# 打印SHA-1校验和
    print(f"SHA-1校验和: {sha1_checksum}")
    
  • 生成数据:生成一个100x100的随机整数数组。
  • 转换为字节:将NumPy数组转换为字节。
  • 计算校验和:使用hashlib库计算MD5和SHA-1校验和。
1.28.5.3 校验和计算方法

校验和计算方法是确保数据完整性的关键。以下是常见的校验和计算方法:

  • MD5

    • 公式:MD5算法通过一系列复杂的数学变换将输入数据转换为128位的校验和。
    • Python实现
      import hashlibdef compute_md5(data):"""计算MD5校验和:param data: 输入数据(字节):return: MD5校验和(字符串)"""return hashlib.md5(data).hexdigest()# 示例
      data = b'Hello, World!'
      md5_checksum = compute_md5(data)
      print(f"MD5校验和: {md5_checksum}")
      
  • SHA-1

    • 公式:SHA-1算法通过一系列复杂的数学变换将输入数据转换为160位的校验和。
    • Python实现
      import hashlibdef compute_sha1(data):"""计算SHA-1校验和:param data: 输入数据(字节):return: SHA-1校验和(字符串)"""return hashlib.sha1(data).hexdigest()# 示例
      data = b'Hello, World!'
      sha1_checksum = compute_sha1(data)
      print(f"SHA-1校验和: {sha1_checksum}")
      
  • CRC32

    • 公式:CRC32算法通过循环冗余校验计算16位的校验码。
    • Python实现
      import zlibdef compute_crc32(data):"""计算CRC32校验码:param data: 输入数据(字节):return: CRC32校验码(整数)"""return zlib.crc32(data)# 示例
      data = b'Hello, World!'
      crc32_checksum = compute_crc32(data)
      print(f"CRC32校验码: {crc32_checksum}")
      
1.28.5.4 常见的数据校验应用场景

数据校验在多个场景中都有重要应用:

  • 文件传输:确保文件在传输过程中没有损坏。
  • 数据备份:确保备份数据与原数据一致。
  • 数据一致性校验:在分布式系统中确保数据的一致性。

参考文献

序号名称链接
1HDF5官方文档HDF Group
2h5py官方文档h5py官网
3阿里云OSS官方文档阿里云OSS
4Python oss2库文档oss2官方文档
5DVC官方文档DVC官网
6Git LFS官方文档Git LFS官网
7Redis官方文档Redis官网
8Python redis库文档redis-py官方文档
9NumPy官方文档NumPy官网
10hashlib库官方文档Python hashlib官方文档
11zlib库官方文档Python zlib官方文档
12循环冗余校验(CRC)Wikipedia CRC
13MD5校验和算法Wikipedia MD5
14SHA-1校验和算法Wikipedia SHA-1
15数据校验的重要性GeeksforGeeks Data Validation
16Python数据科学手册Python Data Science Handbook
17数据版本控制最佳实践Data Version Control Best Practices
18数字签名技术Digital Signature
19跨平台数据持久化设计Cross-Platform Data Persistence
20阿里云断点续传文档阿里云断点续传文档

这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。

相关文章:

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.28 存储之道:跨平台数据持久化方案

好的&#xff0c;我将按照您的要求生成一篇高质量的Python NumPy文章。以下是第28篇《存储之道&#xff1a;跨平台数据持久化方案》的完整内容&#xff0c;包括目录、正文和参考文献。 1.28 存储之道&#xff1a;跨平台数据持久化方案 目录 #mermaid-svg-n1z37AP8obEgptkD {f…...

拼车(1094)

1094. 拼车 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:bool carPooling(vector<vector<int>>& trips, int capacity) {uint32_t passenger_cnt 0;//将原数据按照from排序auto func_0 [](vector<int> & …...

基于Python的人工智能患者风险评估预测模型构建与应用研究(下)

3.3 模型选择与训练 3.3.1 常见预测模型介绍 在构建患者风险评估模型时,选择合适的预测模型至关重要。不同的模型具有各自的优缺点和适用场景,需要根据医疗数据的特点、风险评估的目标以及计算资源等因素进行综合考虑。以下详细介绍几种常见的预测模型。 逻辑回归(Logisti…...

< OS 有关 > Android 手机 SSH 客户端 app: connectBot

connectBot 开源且功能齐全的SSH客户端,界面简洁,支持证书密钥。 下载量超 500万 方便在 Android 手机上&#xff0c;连接 SSH 服务器&#xff0c;去运行命令。 Fail2ban 12小时内抓获的 IP ~ ~ ~ ~ rootjpn:~# sudo fail2ban-client status sshd Status for the jail: sshd …...

向量和矩阵算法笔记

向量和矩阵算法笔记 Ps:因为本人实力有限,有一部分可能不太详细,若有补充评论区回复,QWQ 向量 向量的定义 首先,因为我刚刚学到高中的向量,对向量的看法呢就是一条有长度和方向的线,不过这在数学上的定义其实是不对,甚至跟我看的差别其实有点大,真正的定义就是数域…...

uniapp使用uni.navigateBack返回页面时携带参数到上个页面

我们平时开发中也经常遇到这种场景&#xff0c;跳转一个页面会进行一些操作&#xff0c;操作完成后再返回上个页面同时要携带着一些参数 其实也很简单&#xff0c;也来记录一下吧 假设从A页面 跳转到 B页面 A页面 直接上完整代码了哈&#xff0c;很简单&#xff1a; <t…...

Python 梯度下降法(二):RMSProp Optimize

文章目录 Python 梯度下降法&#xff08;二&#xff09;&#xff1a;RMSProp Optimize一、数学原理1.1 介绍1.2 公式 二、代码实现2.1 函数代码2.2 总代码 三、代码优化3.1 存在问题3.2 收敛判断3.3 函数代码3.4 总代码 四、优缺点4.1 优点4.2 缺点 Python 梯度下降法&#xff…...

Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年

Android Studio 1.0 宣发于 2014 年 12 月&#xff0c;而现在时间来到 2025 &#xff0c;不知不觉间 Android Studio 已经陪伴 Androider 走过十年历程。 Android Studio 10 周年&#xff0c;也代表着了我的职业生涯也超十年&#xff0c;现在回想起来依然觉得「唏嘘」&#xff…...

sem_wait的概念和使用案列

sem_wait 是 POSIX 标准中定义的一个用于同步的函数&#xff0c;它通常用于操作信号量&#xff08;semaphore&#xff09;。信号量是一个整数变量&#xff0c;可以用来控制对共享资源的访问。在多线程编程中&#xff0c;sem_wait 常用于实现线程间的同步。 概念 sem_wait 的基…...

集合的奇妙世界:Python集合的经典、避坑与实战

集合的奇妙世界&#xff1a;Python集合的经典、避坑与实战 内容简介 本系列文章是为 Python3 学习者精心设计的一套全面、实用的学习指南&#xff0c;旨在帮助读者从基础入门到项目实战&#xff0c;全面提升编程能力。文章结构由 5 个版块组成&#xff0c;内容层层递进&#x…...

专业视角深度解析:DeepSeek的核心优势何在?

杭州深度求索&#xff08;DeepSeek&#xff09;人工智能基础技术研究有限公司&#xff0c;是一家成立于2023年7月的中国人工智能初创企业&#xff0c;总部位于浙江省杭州市。该公司由量化对冲基金幻方量化&#xff08;High-Flyer&#xff09;的联合创始人梁文锋创立&#xff0c…...

MySQL 索引存储结构

索引是优化数据库查询最重要的方式之一&#xff0c;它是在 MySQL 的存储引擎层中实现的&#xff0c;所以 每一种存储引擎对应的索引不一定相同。我们可以通过下面这张表格&#xff0c;看看不同的存储引擎 分别支持哪种索引类型&#xff1a; BTree 索引和 Hash 索引是我们比较…...

【ComfyUI专栏】如何使用Git命令行安装非Manager收录节点

当前的ComfyUI的收录的自定义节点很多&#xff0c;但是有些节点属于新出来&#xff0c;或者他的应用没有那么广泛&#xff0c;Manager管理节点 有可能没有收录到&#xff0c;这时候 如果我们需要安装需要怎么办呢&#xff1f;这就涉及到我们自己安装这些节点了。例如下面的内容…...

python算法和数据结构刷题[1]:数组、矩阵、字符串

一画图二伪代码三写代码 LeetCode必刷100题&#xff1a;一份来自面试官的算法地图&#xff08;题解持续更新中&#xff09;-CSDN博客 算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 面试经典 150 题 - 学习计…...

数据分析系列--④RapidMiner进行关联分析(案例)

一、核心概念 1.项集&#xff08;Itemset&#xff09; 2.规则&#xff08;Rule&#xff09; 3.支持度&#xff08;Support&#xff09; 3.1 支持度的定义 3.2 支持度的意义 3.3 支持度的应用 3.4 支持度的示例 3.5 支持度的调整 3.6 支持度与其他指标的关系 4.置信度&#xff0…...

1/30每日一题

从输入 URL 到页面展示到底发生了什么&#xff1f; 1. 输入 URL 与浏览器解析 当你在浏览器地址栏输入 URL 并按下回车&#xff0c;浏览器首先会解析这个 URL&#xff08;统一资源定位符&#xff09;&#xff0c;比如 https://www.example.com。浏览器会解析这个 URL 中的不同…...

vim的多文件操作

[rootxxx ~]# vim aa.txt bb.txt cc.txt #多文件操作 next #下一个文件 prev #上一个文件 first #第一个文件 last #最后一个文件 快捷键: ctrlshift^ #当前和上个之间切换 说明&#xff1a;快捷键ctrlshift^&#xff0c…...

设计转换Apache Hive的HQL语句为Snowflake SQL语句的Python程序方法

首先&#xff0c;根据以下各类HQL语句的基本实例和官方文档记录的这些命令语句各种参数设置&#xff0c;得到各种HQL语句的完整实例&#xff0c;然后在Snowflake的官方文档找到它们对应的Snowflake SQL语句&#xff0c;建立起对应的关系表。在这个过程中要注意HQL语句和Snowfla…...

CAPL与外部接口

CAPL与外部接口 目录 CAPL与外部接口1. 引言2. CAPL与C/C++交互2.1 CAPL与C/C++交互简介2.2 CAPL与C/C++交互实现3. CAPL与Python交互3.1 CAPL与Python交互简介3.2 CAPL与Python交互实现4. CAPL与MATLAB交互4.1 CAPL与MATLAB交互简介4.2 CAPL与MATLAB交互实现5. 案例说明5.1 案…...

无公网IP 外网访问 本地部署夫人 hello-algo

hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式&#xff0c;为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo&#xff0c;并结合路由侠内网穿透实现外网访问本地部署…...

实验四 XML

实验四 XML 目的&#xff1a; 1、安装和使用XML的开发环境 2、认识XML的不同类型 3、掌握XML文档的基本语法 4、了解DTD的作用 5、掌握DTD的语法 6、掌握Schema的语法 实验过程&#xff1a; 1、安装XML的编辑器&#xff0c;可以选择以下之一 a)XMLSpy b)VScode&#xff0c;Vs…...

Autosar-Os是怎么运行的?(内存保护)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 1.功能概述 以TC397芯片为例&#xff0c;英飞凌芯片集成了MPU模块&#xff0c; MPU模块采用了硬件机…...

题单:冒泡排序1

题目描述 给定 n 个元素的数组&#xff08;下标从 1 开始计&#xff09;&#xff0c;请使用冒泡排序对其进行排序&#xff08;升序&#xff09;。 请输出每一次冒泡过程后数组的状态。 要求&#xff1a;每次从第一个元素开始&#xff0c;将最大的元素冒泡至最后。 输入格式…...

多目标优化策略之一:非支配排序

多目标优化策略中的非支配排序是一种关键的技术,它主要用于解决多目标优化问题中解的选择和排序问题,确定解集中的非支配解(也称为Pareto解)。 关于什么是多目标优化问题,可以查看我的文章:改进候鸟优化算法之五:基于多目标优化的候鸟优化算法(MBO-MO)-CSDN博客 多目…...

Go学习:字符、字符串需注意的点

Go语言与C/C语言编程有很多相似之处&#xff0c;但是Go语言中在声明一个字符时&#xff0c;数据类型与其他语言声明一个字符数据时有一点不同之处。通常&#xff0c;字符的数据类型为 char&#xff0c;例如 &#xff1a;声明一个字符 (字符名称为 ch) 的语句格式为 char ch&am…...

Linux文件原生操作

Linux 中一切皆文件&#xff0c;那么 Linux 文件是什么&#xff1f; 在 Linux 中的文件 可以是&#xff1a;传统意义上的有序数据集合&#xff0c;即&#xff1a;文件系统中的物理文件 也可以是&#xff1a;设备&#xff0c;管道&#xff0c;内存。。。(Linux 管理的一切对象…...

解决Oracle SQL语句性能问题(10.5)——常用Hint及语法(7)(其他Hint)

10.5.3. 常用hint 10.5.3.7. 其他Hint 1)cardinality:显式的指示优化器为SQL语句的某个行源指定势。该Hint具体语法如下所示。 SQL> select /*+ cardinality([@qb] [table] card ) */ ...; --注: 1)这里,第一个参数(@qb)为可选参数,指定查询语句块名;第二个参数…...

JavaScript系列(50)--编译器实现详解

JavaScript编译器实现详解 &#x1f528; 今天&#xff0c;让我们深入探讨JavaScript编译器的实现。编译器是一个将源代码转换为目标代码的复杂系统&#xff0c;通过理解其工作原理&#xff0c;我们可以更好地理解JavaScript的执行过程。 编译器基础概念 &#x1f31f; &…...

大数据相关职位 职业进阶路径

大数据相关职位 & 职业进阶路径 &#x1f4cc; 大数据相关职位 & 职业进阶路径 大数据领域涵盖多个方向&#xff0c;包括数据工程、数据分析、数据治理、数据科学等&#xff0c;每个方向的进阶路径有所不同。以下是大数据相关职位的详细解析及其职业进阶关系。 &#…...

基础项目实战——学生管理系统(c++)

目录 前言一、功能菜单界面二、类与结构体的实现三、录入学生信息四、删除学生信息五、更改学生信息六、查找学生信息七、统计学生人数八、保存学生信息九、读取学生信息十、打印所有学生信息十一、退出系统十二、文件拆分结语 前言 这一期我们来一起学习我们在大学做过的课程…...