【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.28 存储之道:跨平台数据持久化方案
好的,我将按照您的要求生成一篇高质量的Python NumPy文章。以下是第28篇《存储之道:跨平台数据持久化方案》的完整内容,包括目录、正文和参考文献。
1.28 存储之道:跨平台数据持久化方案
目录
1.28.1 HDF5格式的层次化存储
元数据管理架构
代码实现
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文件的基本层次化模型:
- 层次化结构:每个组可以包含多个数据集和其他子组,形成树状结构。
- 数据集:数据集是实际存储数据的单元,可以是多维数组或表格。
- 属性:每个数据集和组可以有自己的属性,用于存储元数据。
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 云存储的断点续传实现
分块上传流程
断点续传实现
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的基本步骤:
-
安装阿里云OSS SDK:
pip install oss2
-
初始化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名称和区域
-
上传和下载文件:
# 上传文件 bucket.put_object_from_file('example.h5', 'local_path/example.h5') # 从本地路径上传文件# 下载文件 bucket.get_object_to_file('example.h5', 'local_path/example.h5') # 从OSS下载文件到本地路径
- 初始化客户端:使用
oss2.Auth
和oss2.Bucket
初始化客户端。 - 上传文件:使用
put_object_from_file
方法将本地文件上传到OSS。 - 下载文件:使用
get_object_to_file
方法将OSS文件下载到本地。
1.28.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工作流架构
代码示例
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结合使用,管理大型数据文件和模型。
-
安装DVC:
pip install dvc
-
初始化DVC项目:
dvc init
-
添加数据文件:
dvc add example.h5
-
提交版本:
git add .dvc git add example.h5.dvc git commit -m "Add example.h5"
-
回溯版本:
git checkout <commit-hash> dvc checkout
- 初始化项目:使用
dvc init
初始化DVC项目。 - 添加数据文件:使用
dvc add
将数据文件添加到DVC管理。 - 提交版本:使用Git管理DVC的元数据文件。
- 回溯版本:使用Git和DVC回溯到特定的版本。
1.28.3.3 数据版本控制的实践案例
假设我们有一个数据集example.h5
,我们需要在多个版本中管理这个数据集。以下是具体的实践步骤:
-
初始化DVC和Git:
dvc init git init
-
添加初始数据:
dvc add example.h5 git add .dvc git add example.h5.dvc git commit -m "Initial version of example.h5"
-
修改数据并提交新版本:
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"
-
回溯到初始版本:
git checkout <initial-commit-hash> dvc checkout
- 初始化DVC和Git:在项目中同时初始化DVC和Git。
- 添加初始数据:将初始数据文件添加到DVC管理并提交Git版本。
- 修改数据并提交新版本:修改数据文件并提交新版本。
- 回溯到初始版本:使用Git和DVC回溯到初始版本。
1.28.4 内存数据库集成实践
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缓存加速方案
-
连接Redis服务器:
import redis# 连接Redis服务器 r = redis.Redis(host='localhost', port=6379, db=0) # 连接到本地的Redis服务器
-
缓存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 数据校验和计算方法
校验和验证流程
校验算法实现
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计算校验和的示例:
-
计算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}")
-
计算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 常见的数据校验应用场景
数据校验在多个场景中都有重要应用:
- 文件传输:确保文件在传输过程中没有损坏。
- 数据备份:确保备份数据与原数据一致。
- 数据一致性校验:在分布式系统中确保数据的一致性。
参考文献
序号 | 名称 | 链接 |
---|---|---|
1 | HDF5官方文档 | HDF Group |
2 | h5py官方文档 | h5py官网 |
3 | 阿里云OSS官方文档 | 阿里云OSS |
4 | Python oss2 库文档 | oss2官方文档 |
5 | DVC官方文档 | DVC官网 |
6 | Git LFS官方文档 | Git LFS官网 |
7 | Redis官方文档 | Redis官网 |
8 | Python redis 库文档 | redis-py官方文档 |
9 | NumPy官方文档 | NumPy官网 |
10 | hashlib 库官方文档 | Python hashlib官方文档 |
11 | zlib 库官方文档 | Python zlib官方文档 |
12 | 循环冗余校验(CRC) | Wikipedia CRC |
13 | MD5校验和算法 | Wikipedia MD5 |
14 | SHA-1校验和算法 | Wikipedia SHA-1 |
15 | 数据校验的重要性 | GeeksforGeeks Data Validation |
16 | Python数据科学手册 | Python Data Science Handbook |
17 | 数据版本控制最佳实践 | Data Version Control Best Practices |
18 | 数字签名技术 | Digital Signature |
19 | 跨平台数据持久化设计 | Cross-Platform Data Persistence |
20 | 阿里云断点续传文档 | 阿里云断点续传文档 |
这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。
相关文章:

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.28 存储之道:跨平台数据持久化方案
好的,我将按照您的要求生成一篇高质量的Python NumPy文章。以下是第28篇《存储之道:跨平台数据持久化方案》的完整内容,包括目录、正文和参考文献。 1.28 存储之道:跨平台数据持久化方案 目录 #mermaid-svg-n1z37AP8obEgptkD {f…...

拼车(1094)
1094. 拼车 - 力扣(LeetCode) 解法: 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 手机上,连接 SSH 服务器,去运行命令。 Fail2ban 12小时内抓获的 IP ~ ~ ~ ~ rootjpn:~# sudo fail2ban-client status sshd Status for the jail: sshd …...

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

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

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

Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年
Android Studio 1.0 宣发于 2014 年 12 月,而现在时间来到 2025 ,不知不觉间 Android Studio 已经陪伴 Androider 走过十年历程。 Android Studio 10 周年,也代表着了我的职业生涯也超十年,现在回想起来依然觉得「唏嘘」ÿ…...

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

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

专业视角深度解析:DeepSeek的核心优势何在?
杭州深度求索(DeepSeek)人工智能基础技术研究有限公司,是一家成立于2023年7月的中国人工智能初创企业,总部位于浙江省杭州市。该公司由量化对冲基金幻方量化(High-Flyer)的联合创始人梁文锋创立,…...

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

【ComfyUI专栏】如何使用Git命令行安装非Manager收录节点
当前的ComfyUI的收录的自定义节点很多,但是有些节点属于新出来,或者他的应用没有那么广泛,Manager管理节点 有可能没有收录到,这时候 如果我们需要安装需要怎么办呢?这就涉及到我们自己安装这些节点了。例如下面的内容…...

python算法和数据结构刷题[1]:数组、矩阵、字符串
一画图二伪代码三写代码 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中)-CSDN博客 算法通关手册(LeetCode) | 算法通关手册(LeetCode) (itcharge.cn) 面试经典 150 题 - 学习计…...

数据分析系列--④RapidMiner进行关联分析(案例)
一、核心概念 1.项集(Itemset) 2.规则(Rule) 3.支持度(Support) 3.1 支持度的定义 3.2 支持度的意义 3.3 支持度的应用 3.4 支持度的示例 3.5 支持度的调整 3.6 支持度与其他指标的关系 4.置信度࿰…...

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

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

设计转换Apache Hive的HQL语句为Snowflake SQL语句的Python程序方法
首先,根据以下各类HQL语句的基本实例和官方文档记录的这些命令语句各种参数设置,得到各种HQL语句的完整实例,然后在Snowflake的官方文档找到它们对应的Snowflake SQL语句,建立起对应的关系表。在这个过程中要注意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 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式,为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo,并结合路由侠内网穿透实现外网访问本地部署…...

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

Autosar-Os是怎么运行的?(内存保护)
写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 1.功能概述 以TC397芯片为例,英飞凌芯片集成了MPU模块, MPU模块采用了硬件机…...

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

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

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

Linux文件原生操作
Linux 中一切皆文件,那么 Linux 文件是什么? 在 Linux 中的文件 可以是:传统意义上的有序数据集合,即:文件系统中的物理文件 也可以是:设备,管道,内存。。。(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编译器实现详解 🔨 今天,让我们深入探讨JavaScript编译器的实现。编译器是一个将源代码转换为目标代码的复杂系统,通过理解其工作原理,我们可以更好地理解JavaScript的执行过程。 编译器基础概念 🌟 &…...

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

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