Python随机数复现实战:np.random.seed()在机器学习中的5个关键应用场景

# Python随机数复现深度实战:np.random.seed()在机器学习中的5个关键应用场景 在机器学习和数据科学的探索之旅中,我们常常会陷入一种微妙的困境:代码逻辑清晰,模型架构无误,但每次运行得到的结果却像开盲盒一样,充满了不确定性。这种不确定性并非源于算法本身的缺陷,而是隐藏在代码深处的随机性幽灵在作祟。从神经网络的权重初始化,到数据集的随机划分,再到集成学习中的特征抽样,随机性无处不在。对于追求严谨的开发者而言,这种不可复现性不仅是学术研究的大敌,更是工程落地时排查问题的噩梦。 想象一下,你和同事基于同一份代码、同一份数据讨论模型性能,却因为一次不经意的重启得到了截然不同的AUC分数,所有的比较和优化都失去了基准。或者,你在论文中报告了一个惊艳的结果,审稿人却无法复现,工作的可信度瞬间大打折扣。问题的核心,往往就在于对随机数种子的忽视。`np.random.seed()` 这个看似简单的函数,正是我们驯服随机性、确保实验可复现性的关键钥匙。它不是魔法,而是一种严谨的工程实践,让概率的舞蹈在可控的舞台上进行。 本文将从一线开发者的实战经验出发,深入剖析 `np.random.seed()` 在机器学习工作流中的五个核心应用场景。我们将超越简单的“设置种子”操作,探讨其在模型训练、数据工程、算法对比等复杂环节中的系统性应用技巧,并结合 TensorFlow/Keras、Scikit-learn 等主流框架,展示如何构建一个真正可复现的机器学习管道。无论你是正在撰写需要严格复现的学术论文,还是在企业环境中构建需要稳定交付的AI系统,这些实践都将为你提供坚实的技术保障。 ## 1. 奠定基石:理解随机数种子的工作机制与影响范围 在深入应用场景之前,我们必须先拆解 `np.random.seed()` 的工作原理。许多开发者对其存在误解,认为设置一次就能“一劳永逸”,实则不然。随机数生成器(RNG)的状态是流动的,每一次对随机函数的调用都会消耗并改变这个状态。 **伪随机数的本质**:计算机无法生成真正的随机数,所谓的随机数序列实际上是由一个确定的算法(伪随机数生成器,PRNG)根据一个初始值(种子)计算出来的。相同的种子必然产生相同的序列。`np.random.seed(seed_value)` 的作用,就是将 NumPy 全局随机数生成器的内部状态重置到由 `seed_value` 唯一确定的一个起点。 **关键行为与常见陷阱**: 设置种子影响的是**后续**第一次调用随机函数时序列的起点。之后,RNG的状态会随着每次调用而前进。一个常见的错误认知是“种子对一次运行中的所有随机操作都有效”,实际上,种子只决定了序列的起始点,后续的调用顺序和数量决定了你取到了序列中的哪个数。 让我们通过代码来直观感受: ```python import numpy as np print("场景A:不设置种子,每次运行结果不同") for _ in range(2): print(np.random.rand(3)) print("\n场景B:设置相同种子,序列完全复现") np.random.seed(42) print("第一次运行:", np.random.rand(3)) np.random.seed(42) # 重置状态 print("第二次运行:", np.random.rand(3)) print("\n场景C:种子只影响重置后的第一次调用") np.random.seed(42) a = np.random.rand(3) # 取序列中第1-3个数 b = np.random.rand(3) # 取序列中第4-6个数 print("a:", a) print("b:", b) np.random.seed(42) c = np.random.rand(6) # 取序列中第1-6个数 print("c (前3个应等于a,后3个应等于b):", c) print("c的前3位与a相等吗?", np.allclose(c[:3], a)) print("c的后3位与b相等吗?", np.allclose(c[3:], b)) ``` > 注意:`np.random.seed()` 影响的是 NumPy 的全局随机状态。如果你的代码中混用了 Python 内置的 `random` 模块或其他库(如 TensorFlow)的随机函数,它们各有独立的随机状态,需要分别设置种子。例如,`random.seed(42)` 和 `tf.random.set_seed(42)`。 **影响范围对比表**: 为了更清晰地管理不同层级的随机性,我们需要了解哪些组件受 NumPy 种子影响。 | 组件/库 | 是否受 `np.random.seed()` 影响? | 需要单独设置的种子函数 | | :--- | :--- | :--- | | NumPy 所有随机函数 (rand, randn, permutation等) | **是** | `np.random.seed(seed)` | | Python 内置 `random` 模块 | **否** | `random.seed(seed)` | | Scikit-learn 中依赖 NumPy 的算法(如 `train_test_split`) | **是** (如果使用默认RNG) | 通常通过算法本身的 `random_state` 参数控制 | | TensorFlow (TF) 操作 | **否** | `tf.random.set_seed(seed)` | | Keras (基于TF) 层初始化、Dropout等 | **否** | 在模型编译前设置 `tf.random.set_seed(seed)`,或使用 `keras.utils.set_random_seed(seed)` | | PyTorch | **否** | `torch.manual_seed(seed)` | 理解这张表是构建可复现实验的第一步。一个健壮的复现策略,往往需要多管齐下,确保所有潜在的随机源都被锁定。 ## 2. 数据工程的确定性:可复现的数据集划分与预处理 数据是机器学习的基础,而数据准备阶段的随机性如果处理不当,会直接导致后续所有环节的不可复现。这个阶段主要涉及数据集的洗牌(Shuffling)和划分(Splitting)。 **场景一:确定性的训练集/验证集/测试集划分** 使用 Scikit-learn 的 `train_test_split` 是最常见的操作。为了确保每次划分结果一致,必须固定其 `random_state` 参数。 ```python import numpy as np from sklearn.model_selection import train_test_split # 假设我们有一个特征矩阵 X 和标签 y X, y = np.arange(100).reshape((50, 2)), np.arange(50) # 不可复现的划分(不推荐) X_train_var, X_test_var, y_train_var, y_test_var = train_test_split(X, y, test_size=0.2) print("测试集索引(每次可能不同):", X_test_var[:, 0][:5]) # 可复现的划分(推荐) np.random.seed(42) # 虽然sklearn内部可能用,但显式设置更安全 X_train_fixed, X_test_fixed, y_train_fixed, y_test_fixed = train_test_split( X, y, test_size=0.2, random_state=42 ) print("测试集索引(固定):", X_test_fixed[:, 0][:5]) # 验证复现性 _, X_test_fixed2, _, _ = train_test_split(X, y, test_size=0.2, random_state=42) print("两次划分的测试集是否完全相同?", np.array_equal(X_test_fixed, X_test_fixed2)) ``` **场景二:K折交叉验证中的可复现性** 在进行交叉验证时,确保每一折的数据分配是固定的同样重要。`KFold`、`StratifiedKFold` 等拆分器都提供了 `random_state` 参数。 ```python from sklearn.model_selection import KFold, cross_val_score from sklearn.linear_model import LogisticRegression model = LogisticRegression(max_iter=1000) X, y = np.random.randn(150, 10), np.random.randint(0, 2, 150) # 设置全局种子和拆分器的random_state np.random.seed(123) kf = KFold(n_splits=5, shuffle=True, random_state=123) scores = cross_val_score(model, X, y, cv=kf) print("5折CV得分:", scores) print("平均得分:", scores.mean()) ``` > 提示:对于时间序列数据,通常不进行随机洗牌。此时应使用 `TimeSeriesSplit`,它没有随机性,因此无需设置 `random_state`。 **场景三:自定义数据增强中的随机操作** 当使用像 `imgaug` 或 `albumentations` 这样的库进行图像数据增强时,增强过程(如随机旋转、裁剪)也包含随机性。为了在训练和评估时获得一致的结果(例如,在验证集上评估时不应进行随机增强),你需要固定增强流水线的随机种子。 ```python import albumentations as A # 定义一个包含随机操作的增强流水线 transform = A.Compose([ A.RandomRotate90(p=0.5), A.HorizontalFlip(p=0.5), A.RandomBrightnessContrast(p=0.2), ]) # 为了使增强可复现,可以为每次转换传入固定的随机种子(通过`transform`的`additional_targets`或外部控制) # 更常见的做法是在数据加载器中,通过设置NumPy或Python的随机种子来间接影响。 # 但注意,Albumentations使用自己的随机生成器,最佳实践是使用其确定性模式(如果支持)或在每次应用前设置随机状态。 ``` 在数据工程阶段贯彻种子设置,意味着无论你何时重新运行数据预处理脚本,生成的 `.npz`、`.h5` 或 TFRecord 文件都将是完全一致的,为后续的模型训练提供了稳定的基石。 ## 3. 模型初始化的收敛起点:固定神经网络权重初始化 深度学习模型的性能,尤其是训练初期的收敛行为,对权重初始化非常敏感。不同的初始权重可能导致模型收敛到不同的局部最优解,甚至影响最终的泛化能力。在比较不同超参数或模型架构时,固定初始化是确保对比公平性的前提。 **在 TensorFlow/Keras 中的实践**: TensorFlow 2.x 的 Keras API 提供了多种初始化器,如 `GlorotUniform`(即Xavier均匀初始化)、`HeNormal` 等。这些初始化器内部都使用随机数。 ```python import tensorflow as tf from tensorflow.keras import layers, models def create_model(seed=42): """ 创建一个具有确定性权重初始化的简单MLP模型。 """ # 设置TensorFlow的全局随机种子 tf.random.set_seed(seed) # 对于使用NumPy的某些后端操作,也设置NumPy种子 np.random.seed(seed) # 在初始化器中明确指定种子 initializer = tf.keras.initializers.GlorotUniform(seed=seed) model = models.Sequential([ layers.Dense(128, activation='relu', input_shape=(784,), kernel_initializer=initializer), layers.Dropout(0.2), # Dropout也有随机性,需要全局种子控制 layers.Dense(64, activation='relu', kernel_initializer=initializer), layers.Dense(10, activation='softmax', kernel_initializer=initializer) ]) return model # 创建两个模型,应具有完全相同的初始权重 model_a = create_model(seed=42) model_b = create_model(seed=42) # 比较第一层kernel的权重 weights_a = model_a.layers[0].get_weights()[0] weights_b = model_b.layers[0].get_weights()[0] print("两个模型第一层权重是否完全相同?", np.allclose(weights_a, weights_b)) # 如果seed不同,权重则不同 model_c = create_model(seed=43) weights_c = model_c.layers[0].get_weights()[0] print("模型A与模型C(不同种子)权重是否相同?", np.allclose(weights_a, weights_c)) ``` **更全面的种子设置函数**: 在实际项目中,我习惯编写一个工具函数,一次性设置所有相关库的随机种子,确保实验环境完全确定。 ```python def set_all_seeds(seed=42): """设置Python、NumPy、TensorFlow等库的随机种子以实现最大复现性。""" import os import random os.environ['PYTHONHASHSEED'] = str(seed) # 为了Python哈希行为的可复现性(如字典迭代顺序) random.seed(seed) np.random.seed(seed) tf.random.set_seed(seed) # 对于使用CUDA的TensorFlow,可能需要设置以下环境变量来进一步保证确定性 os.environ['TF_DETERMINISTIC_OPS'] = '1' os.environ['TF_CUDNN_DETERMINISTIC'] = '1' # 注意:完全确定性可能会牺牲一些性能。 # 在脚本最开始调用 set_all_seeds(42) ``` > 注意:即使在CPU上,完全确定性的TensorFlow运行也可能因底层操作并行化的细微差别而难以实现。`TF_DETERMINISTIC_OPS` 等标志致力于解决此问题,但在极少数复杂模型中,百分百的比特级复现仍具挑战。不过,对于绝大多数实验,上述方法足以保证结果在统计学意义上是可复现的。 固定权重初始化后,你就能确信,模型性能的差异真正来源于你所调整的超参数(如学习率、层数),而非每次训练时“运气”的不同。 ## 4. 训练过程的确定性:控制Dropout、Batch Shuffle与数据加载 即使初始权重相同,训练过程中的随机性仍可能导致不同的训练轨迹。主要的随机源包括:Dropout层、每个epoch的数据批次洗牌(Shuffle)、以及一些数据加载器中的随机采样。 **控制Dropout**: Dropout通过在训练期间随机将一部分神经元的输出置零来防止过拟合。这个“随机丢弃”的过程需要被固定。 ```python # 在Keras中,Dropout层的随机性由TensorFlow的全局随机种子控制。 # 因此,只要在模型构建和训练前正确设置了 `tf.random.set_seed()`,Dropout模式就是可复现的。 set_all_seeds(42) model = models.Sequential([ layers.Dense(128, activation='relu', input_shape=(784,)), layers.Dropout(0.5), # 此Dropout的随机掩码将由固定种子控制 layers.Dense(10, activation='softmax') ]) # 使用相同的种子,多次调用 model.predict(training=True) 在相同的输入上应产生相同的Dropout掩码。 ``` **固定数据加载器的洗牌**: 在使用 `tf.data.Dataset` 或 PyTorch `DataLoader` 时,洗牌操作是常见的随机源。 ```python # TensorFlow tf.data.Dataset 示例 import tensorflow as tf # 创建数据集 dataset = tf.data.Dataset.range(10) # 不可复现的洗牌 shuffled_non_reproducible = dataset.shuffle(buffer_size=10) # 可复现的洗牌:提供明确的seed参数 shuffled_reproducible = dataset.shuffle(buffer_size=10, seed=42) # 查看第一批数据 print("可复现洗牌的第一个epoch:") for i, elem in enumerate(shuffled_reproducible.take(5)): print(f" 元素 {i}: {elem.numpy()}") # 重新创建数据集并应用相同seed,应得到相同顺序 dataset2 = tf.data.Dataset.range(10) shuffled_reproducible2 = dataset2.shuffle(buffer_size=10, seed=42) print("\n再次应用相同seed后的第一个epoch:") for i, elem in enumerate(shuffled_reproducible2.take(5)): print(f" 元素 {i}: {elem.numpy()}") ``` **在完整训练循环中整合**: 下面是一个在简单分类任务中整合了所有确定性设置的训练循环示例: ```python def train_deterministic_model(): set_all_seeds(42) # 万事开头,先设种子 # 1. 准备数据 (使用固定的random_state) from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split X, y = make_classification(n_samples=1000, n_features=20, random_state=42) X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42) # 2. 创建模型 (权重初始化已由种子控制) model = create_model(seed=42) # 使用前面定义的函数 # 3. 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 4. 训练模型 (使用validation_split时也需注意随机性,这里我们已显式划分) history = model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=10, batch_size=32, verbose=0) # 静默训练 final_val_acc = history.history['val_accuracy'][-1] print(f"最终验证集准确率: {final_val_acc:.4f}") return final_val_acc # 多次运行,准确率应几乎完全相同(浮点运算顺序可能导致最后几位差异) acc1 = train_deterministic_model() acc2 = train_deterministic_model() print(f"两次运行准确率差异: {abs(acc1 - acc2):.10f}") ``` 通过锁定训练过程中的随机性,我们使得模型训练从一个“嘈杂的随机游走”变成了一个“确定性的优化路径”。这对于调试模型、精调超参数以及进行严格的A/B测试至关重要。 ## 5. 集成学习与算法对比中的公平性保障 集成学习模型,如随机森林(Random Forest)和梯度提升树(Gradient Boosting),其名称中就带有“随机”二字。它们的强大性能部分正来源于引入的随机性(如行采样、列采样)。然而,在比较不同集成算法或同一算法的不同参数时,我们必须控制住这些随机性,确保对比是在相同“运气”条件下进行的。 **Scikit-learn 集成算法的 `random_state`**: 几乎所有Scikit-learn的集成学习器都提供了 `random_state` 参数,用于控制构建每棵树时的随机采样过程。 ```python from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier from sklearn.datasets import make_classification from sklearn.metrics import accuracy_score X, y = make_classification(n_samples=500, n_features=20, random_state=1) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 对比1:同一算法,不同random_state,性能可能波动 rf_no_seed = RandomForestClassifier(n_estimators=50) rf_no_seed.fit(X_train, y_train) acc_no_seed = accuracy_score(y_test, rf_no_seed.predict(X_test)) rf_fixed_seed = RandomForestClassifier(n_estimators=50, random_state=123) rf_fixed_seed.fit(X_train, y_train) acc_fixed_seed = accuracy_score(y_test, rf_fixed_seed.predict(X_test)) print(f"随机森林 (无固定seed) 准确率: {acc_no_seed:.4f}") print(f"随机森林 (固定seed=123) 准确率: {acc_fixed_seed:.4f}") # 多次实例化并训练具有相同random_state的模型,结果应完全一致 rf_fixed_seed2 = RandomForestClassifier(n_estimators=50, random_state=123) rf_fixed_seed2.fit(X_train, y_train) acc_fixed_seed2 = accuracy_score(y_test, rf_fixed_seed2.predict(X_test)) print(f"第二次训练 (相同seed) 准确率: {acc_fixed_seed2:.4f}") print(f"两次结果是否一致? {np.isclose(acc_fixed_seed, acc_fixed_seed2)}") ``` **算法对比实验框架**: 当需要系统比较多种算法时,一个良好的实践是为整个实验流程定义一个“主种子”,然后基于此派生出每个算法或每次运行的子种子,确保实验既可控又可区分。 ```python def compare_algorithms_with_seeds(master_seed=2023): """ 使用确定性种子比较多种算法。 """ set_all_seeds(master_seed) X, y = make_classification(n_samples=1000, n_features=30, random_state=master_seed) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=master_seed) algorithms = { 'RandomForest': RandomForestClassifier(n_estimators=100, random_state=master_seed), 'GradientBoosting': GradientBoostingClassifier(n_estimators=100, random_state=master_seed), 'LogisticRegression': LogisticRegression(max_iter=1000, random_state=master_seed) # 如果 solver 是 ‘sag’, ‘saga’或‘liblinear’,支持random_state } results = {} for name, clf in algorithms.items(): clf.fit(X_train, y_train) score = clf.score(X_test, y_test) results[name] = score print(f"{name:20} 测试准确率: {score:.4f}") return results # 运行比较 results1 = compare_algorithms_with_seeds(2023) print("\n--- 使用相同主种子再次运行 ---") results2 = compare_algorithms_with_seeds(2023) # 验证结果复现性 for algo in results1: if np.isclose(results1[algo], results2[algo]): print(f"{algo}: 结果成功复现") else: print(f"{algo}: 结果存在差异") ``` 这种基于种子的系统性对比,能够让你自信地宣称“算法A在本次实验设置下优于算法B”,因为你知道这个结论不是随机波动造成的假象。 **处理并行计算中的随机性**: 当使用 `n_jobs` 参数进行并行训练时(如随机森林),情况会变得更复杂。不同的进程可能以非确定性的顺序消费随机数,导致即使设置了 `random_state`,结果也可能不可复现。Scikit-learn 在这方面做了很多工作来保证并行下的复现性,但为了绝对安全,一个“笨办法”是暂时设置 `n_jobs=1` 进行最终的确定性实验。或者,确保所有并行 worker 的随机种子都是独立且确定性地生成的。 在实际项目中,尤其是在撰写技术报告或论文时,我通常会创建一个 `experiment_config.yaml` 文件,其中明确记录所有使用的随机种子(数据种子、模型种子、训练种子),以及库的版本号。这就像为实验拍了一张完整的“快照”,任何人在任何时间都能据此重建完全相同的实验环境与结果。`np.random.seed()` 及其在其他库中的等价物,正是这张快照中最关键的参数之一。它代表的不是限制,而是一种追求严谨、可信与协作精神的工程素养。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Python内容推荐

python numpy之np.random的随机数函数使用介绍

python numpy之np.random的随机数函数使用介绍

np.random的随机数函数(1) 函数 说明 rand(d0,d1,..,dn) 根据d0‐dn创建随机数数组,浮点数, [0,1),均匀分布 randn(d0,d1,..,dn) 根据d0‐dn创建随机数数组,标准正态分布 randint(low[,high,shape]) 根据shape创建随机整数或整数数组,范围是[low, high) seed(s) 随机数种子, s是给定的种子值 np.random.rand import numpy as np a = np.random.rand(3, 4, 5) a Out[3]: array([[[0.2

python:numpy.random模块生成随机数

python:numpy.random模块生成随机数

简介 所谓生成随机数,即按照某种概率分布,从给定的区间内随机选取一个数。常用的分布有:均匀分布(uniform distribution),正态分布(normal distribution),泊松分布(poisson distribution)等。 python中的numpy.random模块提供了常用的随机数生成方法,下面简要总结。 按均匀分布生成随机数 rand 功能 按照均匀分布,在[0,1)内生成随机数。 接口 Docstring: rand(d0, d1, ..., dn) Random values in a given shape. Create an array of the

Python内置random模块生成随机数的方法

Python内置random模块生成随机数的方法

主要介绍了Python内置random模块生成随机数的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

详解Python基础random模块随机数的生成

详解Python基础random模块随机数的生成

主要介绍了Python基础random模块随机数的生成,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Python使用numpy产生正态分布随机数的向量或矩阵操作示例

Python使用numpy产生正态分布随机数的向量或矩阵操作示例

主要介绍了Python使用numpy产生正态分布随机数的向量或矩阵操作,简单描述了正态分布的概念并结合实例形式分析了Python使用numpy模块结合matplotlib绘制正态分布曲线图相关操作技巧,需要的朋友可以参考下

python训练数据时打乱训练数据与标签的两种方法小结

python训练数据时打乱训练数据与标签的两种方法小结

今天小编就为大家分享一篇python训练数据时打乱训练数据与标签的两种方法小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

PfDA-assignment:在python中的numpy.random包上进行分配

PfDA-assignment:在python中的numpy.random包上进行分配

PfDA分配 在Python中分配numpy.random包

详解用python生成随机数的几种方法

详解用python生成随机数的几种方法

今天学习了用python生成仿真数据的一些基本方法和技巧,写成博客和大家分享一下。     本篇博客主要讲解如何从给定参数的的正态分布/均匀分布中生成随机数以及如何以给定概率从数字列表抽取某数字或从区间列表的某一区间内生成随机数,按照内容将博客分为3部分,并附上代码。 1 从给定参数的正态分布中生成随机数 当考虑从正态分布中生成随机数时,应当首先知道正态分布的均值和方差(标准差),有了这些,就可以调用python中现有的模块和函数来生成随机数了。这里调用了Numpy模块中的random.normal函数,由于逻辑非参简单,所有直接贴上代码如下: import numpy as np #

Python随机数生成详解[代码]

Python随机数生成详解[代码]

本文详细介绍了Python中几种常见的随机数生成方法及其取值范围。首先,random.randint(a,b)生成的是前闭后闭区间的整数,即[a,b]。其次,np.random.randint(a,b)生成的是前闭后开区间的整数,即[a,b)。此外,range()函数也是前闭后开区间,例如range(0,5)生成[0,1,2,3,4]。random.rand(d0,d1,…,dn)则生成均匀分布在[0,1)的随机数数组。最后,文章还介绍了np.random.seed(x)的作用,即设置随机数种子以确保结果可复现。如果不设置seed,每次生成的随机数会不同。

简述python&pytorch 随机种子的实现

简述python&pytorch 随机种子的实现

随机数广泛应用在科学研究, 但是计算机无法产生真正的随机数, 一般成为伪随机数. 它的产生过程: 给定一个随机种子(一个正整数), 根据随机算法和种子产生随机序列. 给定相同的随机种子, 计算机产生的随机数列是一样的(这也许是伪随机的原因). 随机种子是什么? 随机种子是针对随机方法而言的。 随机方法:常见的随机方法有 生成随机数,以及其他的像 随机排序 之类的,后者本质上也是基于生成随机数来实现的。在深度学习中,比较常用的随机方法的应用有:网络的随机初始化,训练集的随机打乱等。 随机种子的取值范围? 可以是任意数字,如10,1000 python random 下面以python的rand

Python数据集切分实例

Python数据集切分实例

今天小编就为大家分享一篇Python数据集切分实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Python的matplotlib绘图如何修改背景颜色的实现

Python的matplotlib绘图如何修改背景颜色的实现

在主图中背景颜色不知道怎么改,plt.plot()中没有axisbg参数。 但是子图可以对plt.subplot的参数做修改,下面是对子图的背景颜色修改代码 import matplotlib.pyplot as plt import numpy as np # Fixing random state for reproducibility np.random.seed(19680801) dt = 0.01 t = np.arange(0, 30, dt) nse1 = np.random.randn(len(t)) # white noise 1 nse2 = np.ra

在python中画正态分布图像的实例

在python中画正态分布图像的实例

今天小编就为大家分享一篇在python中画正态分布图像的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Python生成任意范围任意精度的随机数方法

Python生成任意范围任意精度的随机数方法

实例如下所示: # -*- coding: utf-8 -*- import numpy as np random = np.random.RandomState(0)#RandomState生成随机数种子 for i in range(200):#随机数个数 a = random.uniform(-0.1, 0.1)#随机数范围 print round(a, 2)#随机数精度要求 以上这篇Python生成任意范围任意精度的随机数方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:p

Python 绘制可视化折线图

Python 绘制可视化折线图

主要介绍了Python 绘制可视化折线图的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

Python随机函数详解[可运行源码]

Python随机函数详解[可运行源码]

本文详细介绍了Python中常用的随机函数及其用法,包括random.random()、random.uniform()、np.random.rand()、np.random.normal()、np.random.randn()、np.random.standard_normal()、random.sample()、np.random.randint()、random.randrange()、random.choice()、random.shuffle()和random.seed()。文章通过示例代码展示了这些函数的具体应用,并比较了相似函数之间的区别,如random.sample()与np.random.randint()在返回唯一值与重复值上的差异,以及np.random.rand()与random.random()在返回数据数量上的不同。此外,还介绍了如何通过random.seed()设定随机种子以固定随机数生成结果。

python 实现快速生成连续、随机字母列表

python 实现快速生成连续、随机字母列表

今天小编就为大家分享一篇python 实现快速生成连续、随机字母列表,具有很好的价值,希望对大家有所帮助。一起跟随小编过来看看吧

Python中numpy的基础用法1

Python中numpy的基础用法1

• 数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据• 设置专门的数组对象,经过优化,可以提升这类应用的运算速度观察:科学计算中,一个维度所有数据的

python-numpy-指数分布实例详解

python-numpy-指数分布实例详解

今天小编就为大家分享一篇python-numpy-指数分布实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

python数据分析可转债收益分析.zip

python数据分析可转债收益分析.zip

数据分析可视化实战项目

最新推荐最新推荐

recommend-type

python快速编写单行注释多行注释的方法

在python代码编写过程中,养成注释的习惯非常有用,可以让自己或别人后续在阅读代码时,轻松理解代码的含义。 如果只是简单的单行注释,可直接用“#”号开头,放于代码前面。 单行注释也可以跟代码同行,放在代码后面,以“#”号开头。 如果是多行注释,可在每行注释前面加“#”号。 多行注释,也可用3个双引号括起来。 多行注释,还可以用3个单引号括起来。 如需将现有的代码注释掉,可先选中需要注释的代码。 再按Ctrl + / ,这样选中的代码行前均会加上“#”号,表示该代码已经被注释掉了,不会再运行。 以上就是本次介绍的关于python如何快速编写单行注释多行注释的具体操作,感谢大家对软
recommend-type

Python中注释(多行注释和单行注释)的用法实例

前言 学会向程序中添加必要的注释,也是很重要的。注释不仅可以用来解释程序某些部分的作用和功能(用自然语言描述代码的功能),在必要时,还可以将代码临时移除,是调试程序的好帮手。 当然,添加注释的最大作用还是提高程序的可读性!很多时候,笔者宁愿自己写一个应用,也不愿意去改进别人的代码,没有合理的注释是一个重要原因。虽然良好的代码可自成文挡,但我们永远也不清楚今后读这段代码的人是谁,他是否和你有相同的思路。或者一段时间以后,你自己也不清楚当时写这段代码的目的了。 总的来说,一旦程序中注释掉某部分内容,则该内容将会被 Python 解释器忽略,换句话说,此部分内容将不会被执行。 通常而言,合理的代码
recommend-type

Pyhton中单行和多行注释的使用方法及规范

大家都知道python中的注释有多种,有单行注释,多行注释,批量注释,中文注释也是常用的。python注释也有自己的规范,这篇文章文章中会给大家详细介绍Pyhton中单行和多行注释的使用方法及规范,有需要朋友们可以参考借鉴。
recommend-type

Python中的单行、多行、中文注释方法

今天小编就为大家分享一篇Python中的单行、多行、中文注释方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

Perl中的单行注释和多行注释语法

主要介绍了Perl中的单行注释和多行注释语法,本文还同时讲解了其它常见编程语言的单行注释和多行注释语法,需要的朋友可以参考下
recommend-type

学生成绩管理系统C++课程设计与实践

资源摘要信息:"学生成绩信息管理系统-C++(1).doc" 1. 系统需求分析与设计 在进行学生成绩信息管理系统开发前,首先需要进行系统需求分析,这是确定系统开发目标与范围的过程。需求分析应包括数据需求和功能需求两个方面。 - 数据需求分析: - 学生成绩信息:需要收集学生的姓名、学号、课程成绩等数据。 - 数据类型和长度:明确每个数据项的数据类型(如字符串、整型等)和长度,例如学号可能是字符串类型且长度为一定值。 - 描述:详细描述每个数据项的意义,以确保系统能够准确处理。 - 功能需求分析: - 列出功能列表:用户界面应提供清晰的操作指引,列出所有可用功能。 - 查询学生成绩:系统应能通过学号或姓名查询学生的成绩信息。 - 增加学生成绩信息:允许用户添加未保存的学生成绩信息。 - 删除学生成绩信息:能够通过学号或姓名删除已经保存的成绩信息。 - 修改学生成绩信息:通过学号或姓名修改已有的成绩记录。 - 退出程序:提供安全退出程序的选项,并确保所有修改都已保存。 2. 系统设计 系统设计阶段主要完成内存数据结构设计、数据文件设计、代码设计、输入输出设计、用户界面设计和处理过程设计。 - 内存数据结构设计: - 使用链表结构组织内存中的数据,便于动态增删查改操作。 - 数据文件设计: - 选择文本文件存储数据,便于查看和编辑。 - 代码设计: - 根据功能需求,编写相应的函数和模块。 - 输入输出设计: - 设计简洁明了的输入输出提示信息和操作流程。 - 用户界面设计: - 用户界面应为字符界面,方便在命令行环境下使用。 - 处理过程设计: - 设计数据处理流程,确保每个操作都有明确的处理逻辑。 3. 系统实现与测试 实现阶段需要根据设计阶段的成果编写程序代码,并进行系统测试。 - 程序编写: - 完成系统设计中所有功能的程序代码编写。 - 系统测试: - 设计测试用例,通过测试用例上机测试系统。 - 记录测试方法和测试结果,确保系统稳定可靠。 4. 设计报告撰写 最后,根据系统开发的各个阶段,撰写详细的设计报告。 - 系统描述:包括问题说明、数据需求和功能需求。 - 系统设计:详细记录内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。 - 系统测试:包括测试用例描述、测试方法和测试结果。 - 设计特点、不足、收获和体会:反思整个开发过程,总结经验和教训。 时间安排: - 第19周(7月12日至7月16日)完成项目。 - 7月9日8:00到计算机学院实验中心(三楼)提交程序和课程设计报告。 指导教师和系主任(或责任教师)需要在文档上签名确认。 系统需求分析: - 使用表格记录系统需求分析的结果,包括数据项、数据类型、数据长度和描述。 - 分析数据项如学生成绩信息、状态器、链表节点等,确定其属性和行为。 以上就是文档中提到的学生成绩信息管理系统开发的关键知识点。开发此类系统需要熟练掌握C++编程基础,了解面向对象的程序设计思想,以及熟悉文件操作和链表等数据结构的应用。此外,良好的软件开发流程意识、测试意识和文档撰写能力也是必不可少的。
recommend-type

别再手动拖拽了!用Lumerical脚本批量创建FDTD仿真结构(附完整代码)

# 告别低效建模:Lumerical脚本自动化实战指南 在光子学仿真领域,时间就是科研生命线。当同行还在GUI界面里反复点击菜单时,你已经用脚本批量生成了20组参数化结构——这不是未来场景,而是每位FDTD用户都应该掌握的基础生产力革命。本文将彻底改变你与Lumerical的交互方式,从手动拖拽的农耕时代,跃迁到自动化建模的工业文明。 ## 1. 为何脚本建模是必然选择 2019年Nature Photonics的一项研究显示,科研工作者在仿真工具上平均浪费37%的时间在重复性操作上。对于需要参数扫描的纳米光学结构设计,这个数字可能更高。手动创建10个不同尺寸的纳米柱阵列意味着: -
recommend-type

Java邮件解析任务中,如何安全高效地提取HTML邮件内容并避免硬编码、资源泄漏和类型转换异常?

<think>我们被要求优化一段Java代码,该代码用于处理邮件(特别是来自特定发件人的构建通知邮件)。代码的主要问题包括: 1. 重复获取邮件内容:在检查MIME类型后,多次调用`msg[i].getContent()`,这可能导致性能问题或流关闭异常。 2. 类型转换问题:直接将邮件内容转换为`Multipart`而不进行类型检查,可能引发`ClassCastException`。 3. 代码结构问题:逻辑嵌套过深,可读性差,且存在重复代码(如插入邮件详情的操作在两个地方都有)。 4. 硬编码和魔法值:例如在解析HTML表格时使用了硬编码的索引(如list3.get(10)),这容易因邮件
recommend-type

RH公司应收账款管理优化策略研究

资源摘要信息:"本文针对RH公司的应收账款管理问题进行了深入研究,并提出了改进策略。文章首先分析了应收账款在企业管理中的重要性,指出其对于提高企业竞争力、扩大销售和充分利用生产能力的作用。然后,以RH公司为例,探讨了公司应收账款管理的现状,并识别出合同管理、客户信用调查等方面的不足。在此基础上,文章提出了一系列改善措施,包括完善信用政策、改进业务流程、加强信用调查和提高账款回收力度。特别强调了建立专门的应收账款回收部门和流程的重要性,并建议在实际应用过程中进行持续优化。同时,文章也意识到企业面临复杂多变的内外部环境,因此提出的策略需要根据具体情况调整和优化。 针对财务管理领域的专业学生和从业者,本文提供了一个关于应收账款管理问题的案例研究,具有实际指导意义。文章还探讨了信用管理和征信体系在应收账款管理中的作用,强调了它们对于提升企业信用风险控制和市场竞争能力的重要性。通过对比国内外企业在应收账款管理上的差异,文章总结了适合中国企业实际环境的应收账款管理方法和策略。" 根据提供的文件内容,以下是详细的知识点: 1. 应收账款管理的重要性:应收账款作为企业的一项重要资产,其有效管理关系到企业的现金流、财务健康以及市场竞争力。不良的应收账款管理会导致资金链断裂、坏账损失增加等问题,严重影响企业的正常运营和长远发展。 2. 应收账款的信用风险:在信用交易日益频繁的商业环境中,企业必须对客户信用进行评估,以便采取合理的信用政策,降低信用风险。 3. 合同管理的薄弱环节:合同是应收账款管理的法律基础,严格的合同管理能够保障企业权益,减少因合同问题导致的应收账款风险。 4. 客户信用调查:了解客户的信用状况对于预测和控制应收账款风险至关重要。企业需要建立有效的客户信用调查机制,识别和筛选信用良好的客户。 5. 应收账款回收策略:企业应建立有效的账款回收机制,包括定期的账款跟进、逾期账款的催收等。同时,建立专门的应收账款回收部门可以提升回收效率。 6. 应收账款管理流程优化:通过改进企业内部管理流程,如简化审批流程、提高工作效率等措施,能够提升应收账款的管理效率。 7. 应收账款管理策略的调整和优化:由于企业的内外部环境复杂多变,因此制定的管理策略需要根据实际情况进行动态调整和持续优化。 8. 信用管理和征信体系的作用:建立和完善企业内部信用管理体系和征信体系,有助于企业更好地控制信用风险,并在市场竞争中占据有利地位。 9. 对比国内外应收账款管理实践:通过研究国内外企业在应收账款管理上的不同做法和经验,可以借鉴先进的管理理念和方法,提升国内企业的应收账款管理水平。 综上所述,本文深入探讨了应收账款管理的多个方面,为RH公司乃至其他同类型企业提供了应收账款管理的改进方向和策略,对于财务管理专业的教育和实践都具有重要的参考价值。
recommend-type

新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构

# 新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构 第一次拿到BingPi-M2开发板时,面对Tina Linux SDK里密密麻麻的文件夹,我完全不知道从哪下手。就像走进一个陌生的大仓库,每个货架上都堆满了工具和零件,却找不到操作手册。这种困惑持续了整整两天,直到我意识到——理解目录结构比死记硬背每个文件更重要。 ## 1. 为什么SDK目录结构如此重要 想象你正在组装一台复杂的模型飞机。如果所有零件都混在一个箱子里,你需要花大量时间寻找每个螺丝和面板。但如果有分门别类的隔层,标注着"机身部件"、"电子设备"、"紧固件",组装效率会成倍提升。Ti