Python | 机器学习之数据清洗

 

🌈个人主页:Sarapines Programmer
🔥 系列专栏:《人工智能奇遇记》
🔖少年有梦不应止于心动,更要付诸行动。

目录结构


1. 机器学习之数据清洗概念

1.1 机器学习

1.2 数据清洗

2. 数据清洗

2.1 实验目的

2.2 实验准备

2.3 实验原理

2.4 实验内容

2.4.1 获取数据,整体去重;

2.4.2 整体查看数据类型以及缺失情况;

2.4.3 删除缺失率过高的变量;

2.4.4 删除不需要入模的变量;

2.4.5 删除文本型变量,有缺失值行;

2.4.6 修复变量类型;

2.4.7 变量数据处理方式划分;

2.4.8 变量数据处理方式划分;

2.4.9 拼接数据处理流水线.

2.5 实验心得


1. 机器学习之数据清洗概念

1.1 机器学习

传统编程要求开发者明晰规定计算机执行任务的逻辑和条条框框的规则。然而,在机器学习的魔法领域,我们向计算机系统灌输了海量数据,让它在数据的奔流中领悟模式与法则,自主演绎未来,不再需要手把手的指点迷津。

机器学习,犹如三千世界的奇幻之旅,分为监督学习、无监督学习和强化学习等多种类型,各具神奇魅力。监督学习如大师传道授业,算法接收标签的训练数据,探索输入与输出的神秘奥秘,以精准预测未知之境。无监督学习则是数据丛林的探险者,勇闯没有标签的领域,寻找隐藏在数据深处的秘密花园。强化学习则是一场与环境的心灵对话,智能体通过交互掌握决策之术,追求最大化的累积奖赏。

机器学习,如涓涓细流,渗透各行各业。在图像和语音识别、自然语言处理、医疗诊断、金融预测等领域,它在智慧的浪潮中焕发生机,将未来的可能性绘制得更加丰富多彩。

1.2 数据清洗

数据清洗,曲调优美的数据魔法,是数据分析与机器学习的不可或缺篇章。其目标在于在数据舞台登场前,发掘、矫正或祛除问题、不准确、不完整或无效的角色,以确保数据的绝对贵族品质,从而让分析和建模的舞台更加光彩夺目。

主要任务包括:

  • 缺失值魔法:发现并施展缺失值的魔法,通过填充、删除或其他巧妙手法,为数据赋予完美的元素。

  • 异常值舞台:挑战并征服异常值,这些幽灵可能源于数据输入的误差、设备的叛变等。

  • 重复值消失术:感知并消除数据舞台上的重复记录,确保数据的独特华丽,让每个角色都是独一无二的明星。

  • 数据格式魔咒:将数据转换为统一的魔法符号,使其更适合于分析和建模的神奇仪式。

  • 一致性合唱:在数据的音乐殿堂中,确保不同部分之间的和谐奏鸣,让数据流畅一致。

  • 数据变形技艺:对数据进行变形,使其适用于特定的分析或建模任务。

  • 噪音降妖:发现并减弱数据中的噪音,提升数据的纯净度。

数据清洗,是数据分析的星光耀眼的序幕,因为原始数据集可能蕴含各种幽灵,而这些隐患将影响最终分析和建模的辉煌表演。通过巧妙的数据清洗,数据的可靠性得以提升,为分析和模型的绚丽演绎打下坚实基石。

机器学习程序源文件icon-default.png?t=N7T8https://download.csdn.net/download/m0_57532432/88521177?spm=1001.2014.3001.5503


2. 数据清洗

2.1 实验目的

(1)了解数据清洗的重要性;

(2)掌握数据清洗基本方法。


2.2 实验准备

(1)安装机器学习必要库,如NumPy、Pandas、Scikit-learn等;

(2)配置环境用来运行 Python、Jupyter Notebook和相关库等内容。


2.3 实验原理

在数据清洗中,针对不同情况需采取相应措施。发现重复记录或同义但不同名称情况时,进行去重或标准化,确保记录唯一一致。处理数据类型不匹配,如字符串误标为数值型,进行类型转换或纠正,确保每个特征正确类型。

同时,对连续型变量的缺失值进行处理。可选择删除含缺失值记录、用均值或中位数填充,或利用插值方法估算缺失值。保证数据集在缺失值方面完整,以确保后续分析和建模的有效进行。


2.4 实验内容

导入必要的库函数:

图1-1

代码:

# -*- coding: utf-8 -*-import osimport pandas as pdimport numpy as npnp.set_printoptions(suppress=True,   precision=20,  threshold=10,  linewidth=40)# np禁止科学计数法显示pd.set_option('display.float_format',lambda x : '%.2f' % x)# pd禁止科学计数法显示

2.4.1 获取数据,整体去重;

图1-2

代码:

data1 = pd.read_csv('./data/test_health.csv') #读取数据data1

图1-3

代码:

data1.drop_duplicates(inplace=True) # 使用drop_duplicates去重,删除重复出现的行data1

图1-4

代码:

data1.reset_index(drop=True, inplace=True) # 重置索引data1

2.4.2 整体查看数据类型以及缺失情况;

图1-5

代码:

data1.info() #整体查看数据类型,根据数量查看是否缺失

2.4.3 删除缺失率过高的变量;

图1-6

运行结果

图1-7

代码:

# 定义查找缺失变量函数,返回缺失值率>指定缺失率(narate)的列表def selectByNan(data, narate=0.2):''':param data: 查找数据集:param narate: 设定变量的缺失值率,默认20%:return: 返回缺失率>narate的变量名称列表'''dataNumber = data.shape[0]  # 获取数据集的样本量NanList = []  # 存储缺失率大于指定缺失率的变量名称列表# 遍历数据集的每一列for col in data.columns:# 计算每一列的缺失值率,并与指定缺失率进行比较if (data[col].isna().sum() / dataNumber) >= narate:NanList.append(col)  # 如果缺失值率大于指定缺失率,则将变量名称添加到NanList中# 打印缺失值率大于指定缺失率的变量名称列表print(f'缺失量在{narate * 100}%以上的变量有:{NanList}')return NanList  # 返回缺失值率大于指定缺失率的变量名称列表# 调用selectByNan函数,查找缺失值率大于指定缺失率的变量,并将其存储在listNeedDrop中listNeedDrop = selectByNan(data1, narate=0.2)# 在data1上调用drop方法删除listNeedDrop中的变量列,并创建data2作为副本data2 = data1.drop(listNeedDrop, axis=1).copy()data2# 返回删除指定列后的data1副本data2

2.4.4 删除不需要入模的变量;

图1-8

运行结果

图1-9

代码:

# 删除比如日期类型 loan_rct_end_date,客户编号 cus_no等listNeedDrop = ['cus_no','loan_rct_end_date']  # 创建一个包含不需要入模的变量的列表data2.drop(listNeedDrop, axis=1, inplace=True) # 使用DataFrame的drop方法删除指定的列# 参数listNeedDrop是要删除的列名的列表# axis=1表示按列删除,axis=0表示按行删除# inplace=True表示在原始DataFrame上进行修改data2# 返回删除指定列后的DataFrame对象

2.4.5 删除文本型变量,有缺失值行;

图1-10

结果如下:

图1-11

图1-12

      代码:

# 查找文本型函数变量名列表def get_object_list(data, print_value=False):''':param data: 要查找的数据集:param print_value: 是否打印文本型列的具体数据,默认为False:return: 返回文本型变量名列表'''object_list = []  # 存储文本型变量名的列表# 遍历数据集的每一列for col in data.columns:# 检查每一列的数据类型是否为object(文本型)if str(data[col].dtype) == 'object':object_list.append(col)  # 如果是文本型变量,则将其名称添加到object_list中if print_value == True:  # 如果设置了print_value为True,则打印文本型列的具体数据print(data[col].value_counts())print(f'-' * 50)return object_list  # 返回文本型变量名列表# 调用get_object_list函数,查找data2中的文本型变量,并将print_value设置为Trueobject_list = get_object_list(data2, True)# 输出文本型变量名列表object_list# 情况3,删除文本型变量中有空值的行data2.dropna(subset=object_list, axis=0, inplace=True)# 使用dropna方法删除包含文本型变量中任何空值的行# 参数subset指定要考虑的列(文本型变量列)# axis=0表示按行删除# inplace=True表示在原始DataFrame上进行修改data2.reset_index(drop=True, inplace=True)# 使用reset_index方法重置行索引,并丢弃旧的索引# 参数drop=True表示丢弃旧的索引# inplace=True表示在原始DataFrame上进行修改data2# 返回删除了包含文本型变量中任何空值的行并重置索引后的data2

2.4.6 修复变量类型;

图1-13

代码如下:

data2.info() #整体查看数据类型,根据数量查看是否缺失

图1-14

代码如下:

# 查找float类型def isfloatnum(string):'''检查字符串是否为浮点数:param string: 要检查的字符串:return: 如果是浮点数返回True,否则返回False'''list_str = string.split('.')  # 将字符串按照小数点进行分割if len(list_str) > 2:  # 如果分割后的列表长度大于2,说明小数点不止一个,不是浮点数return Falseelse:for num in list_str:if not num.isdigit():  # 如果分割后的列表中有元素不是数字,不是浮点数return Falsereturn True  # 否则是浮点数# 查找连续型变量是否有字符串情况存在def find_str_innum(data):'''通过检查传入数据集中object类型的变量,统计字符串str_sum数量 以及 浮点数/整数 int_num数量:param data: 传入需要检查的数据集:return: 包含object类型变量、数值型和字符串统计的DataFrame。列包括object_facname(变量名)、sample_num(样本量)、str_sum(文本数据量)、float/int_sum(浮点数/整数数据量)、str_detail(字符串详细内容)'''df_find_str_innum = pd.DataFrame(columns=['object_facname', 'sample_num', 'str_sum', 'float/int_sum', 'str_detail'])num_index = 0# 遍历数据集的每一列for col in data.columns:if str(data[col].dtype) == 'object':  # 检查列的数据类型是否为object(文本型)n_samples = data[col].shape[0]  # 样本量sum_str = 0  # 文本数据量sum_float = 0  # 浮点数/整数数据量list_detail = []  # 存储字符串详细内容的列表for value in data[col]:if isfloatnum(value) or value.isdigit():  # 如果值是浮点数或整数sum_float += 1else:  # 否则是字符串sum_str += 1list_detail.append(value)if n_samples != sum_str:  # 如果样本量不等于文本数据量,说明该列还包含其他类型的数据(浮点数/整数)list_detail = np.unique(list_detail)  # 去重字符串详细内容str_detail = ','.join(list_detail)  # 将字符串详细内容以逗号连接else:str_detail = ''df_find_str_innum.loc[num_index] = [col, n_samples, sum_str, sum_float] + [str_detail]  # 添加到结果DataFramenum_index += 1return df_find_str_innum# 调用find_str_innum函数,传入数据集data2,获得包含统计信息的DataFramedf_find_str_innum = find_str_innum(data2)df_find_str_innum# 返回

图1-15

代码如下:

data2.drop(data2[(data2['test1'] == 'Na') |(data2['test1'] == 'unknown')].index, inplace=True)data2.reset_index(drop=True, inplace=True) # 恢复索引data2

图1-16

代码如下:

# 将test1转换为float类型data2['test1'] = data2['test1'].astype(float)data2.info()


2.4.7 变量数据处理方式划分;

图1-17

代码如下:

# 需要对数据进行划分# ① 取数值、连续类型的数据list_train_num = ['baseline value','fetal_movement','uterine_contractions','light_decelerations','severe_decelerations','prolongued_decelerations','abnormal_short_term_variability','mean_value_of_short_term_variability','percentage_of_time_with_abnormal_long_term_variability','mean_value_of_long_term_variability','histogram_width','histogram_min','histogram_max','histogram_number_of_peaks','histogram_number_of_zeroes','histogram_mode','histogram_mean','histogram_median','histogram_variance','histogram_tendency','test1','test2']# ②取文本/离散、无需独热编码 类型的数据(类似 住宅类型、就业类型 等字段)list_train_str = ['sex','employ']# ③取文本/离散、需 独热编码 类型的数据(类似 教育水平分类 等变量)list_train_str_needtrf = ['reside_type','agetype']# 查看训练集空值情况(此时只剩数值型空值,其他类型的数据都被处理了)data2[data2.isnull().any(axis=1)].head()

源码解释如下:

  • list_train_num: 创建一个包含数值、连续类型数据的列表。该列表包含了一系列数值型变量的名称,例如'baseline value'、'fetal_movement'等。
  • list_train_str: 创建一个包含文本/离散、无需独热编码的数据类型的列表。该列表包含了一系列文本型变量的名称,例如'sex'、'employ'等。
  • list_train_str_needtrf: 创建一个包含文本/离散、需要独热编码的数据类型的列表。该列表包含了一系列需要进行独热编码的变量的名称,例如'reside_type'、'agetype'等。
  • data2[data2.isnull().any(axis=1)].head(): 使用isnull().any(axis=1)方法检查data2中是否存在空值,并返回含有空值的行。.head()用于查看返回结果的前几行。这里的目的是查看训练集中数值型变量的空值情况。

图1-18

图1-19

代码如下:

# 数据清洗函数定义from sklearn.impute import SimpleImputerfrom sklearn.base import BaseEstimator, TransformerMixinfrom sklearn.preprocessing import LabelEncoderfrom sklearn.preprocessing import LabelBinarizerfrom sklearn.utils import check_arrayfrom scipy import sparseclass CategoricalEncoder(BaseEstimator, TransformerMixin):"""将分类特征编码为数字数组。此函数输入 分类的整数矩阵 或 字符串矩阵,将把分类(离散)特征所具有的值转化为数组"""def __init__(self, encoding='onehot', categories='auto', dtype=np.float64,handle_unknown='error'):self.encoding = encodingself.categories = categoriesself.dtype = dtypeself.handle_unknown = handle_unknowndef fit(self, X, y=None):"""Fit the CategoricalEncoder to X.Parameters----------X : array-like, shape [n_samples, n_feature]The data to determine the categories of each feature.Returns-------self"""# 报错预警if self.encoding not in ['onehot', 'onehot-dense', 'ordinal']:template = ("encoding should be either 'onehot', 'onehot-dense' ""or 'ordinal', got %s")raise ValueError(template % self.handle_unknown)if self.handle_unknown not in ['error', 'ignore']:template = ("handle_unknown should be either 'error' or ""'ignore', got %s")raise ValueError(template % self.handle_unknown)if self.encoding == 'ordinal' and self.handle_unknown == 'ignore':raise ValueError("handle_unknown='ignore' is not supported for"" encoding='ordinal'")X = check_array(X, dtype=np.object, accept_sparse='csc', copy=True)n_samples, n_features = X.shape # n_samples 样本数,n_features 特征数self._label_encoders_ = [LabelEncoder() for n_f in range(n_features)]for i in range(n_features):le = self._label_encoders_[i]Xi = X[:, i]if self.categories == 'auto':le.fit(Xi)else:valid_mask = np.in1d(Xi, self.categories[i])if not np.all(valid_mask):if self.handle_unknown == 'error':diff = np.unique(Xi[~valid_mask])msg = ("Found unknown categories {0} in column {1}"" during fit".format(diff, i))raise ValueError(msg)le.classes_ = np.array(np.sort(self.categories[i]))self.categories_ = [le.classes_ for le in self._label_encoders_]return selfdef transform(self, X):"""Transform X using one-hot encoding.Parameters----------X : array-like, shape [n_samples, n_features]The data to encode.Returns-------X_out : sparse matrix or a 2-d arrayTransformed input."""X = check_array(X, accept_sparse='csc', dtype=np.object, copy=True)n_samples, n_features = X.shapeX_int = np.zeros_like(X, dtype=np.int) # 构建一个和 X 维度相同的X_mask = np.ones_like(X, dtype=np.bool) # 构建一个和 X 维度相同的for i in range(n_features): # 对每个变量开始循环valid_mask = np.in1d(X[:, i], self.categories_[i])if not np.all(valid_mask):if self.handle_unknown == 'error':diff = np.unique(X[~valid_mask, i])msg = ("Found unknown categories {0} in column {1}"" during transform".format(diff, i))raise ValueError(msg)else:# Set the problematic rows to an acceptable value and# continue `The rows are marked `X_mask` and will be# removed later.X_mask[:, i] = valid_mask # unique矩阵赋予X_maskX[:, i][~valid_mask] = self.categories_[i][0]X_int[:, i] = self._label_encoders_[i].transform(X[:, i])if self.encoding == 'ordinal':return X_int.astype(self.dtype, copy=False)mask = X_mask.ravel() # .ravel()将矩阵向量化n_values = [cats.shape[0] for cats in self.categories_]n_values = np.array([0] + n_values)indices = np.cumsum(n_values)column_indices = (X_int + indices[:-1]).ravel()[mask]# 找到该变量某个离散值中的所有的列索引row_indices = np.repeat(np.arange(n_samples, dtype=np.int32),n_features)[mask]data = np.ones(n_samples * n_features)[mask]out = sparse.csc_matrix((data, (row_indices, column_indices)),shape=(n_samples, indices[-1]),dtype=self.dtype).tocsr()# out = out[:,1:]# 这里为one_hot,如果要转换成哑变量需要将状态进行k-1删除,防止虚拟陷阱!if self.encoding == 'onehot-dense':return out.toarray()else:return outclass DataFrameSelector(BaseEstimator, TransformerMixin):def __init__(self, attribute_names):self.attribute_names = attribute_namesdef fit(self, X, y=None):return selfdef transform(self, X):return X[self.attribute_names].valuesclass ExeLabelEncoder(BaseEstimator, TransformerMixin):def __init__(self):self._stretltype = 1def fit(self, X, y=None):return selfdef transform(self, X):encoder = LabelEncoder()n_samples, n_features = X.shapearr = np.zeros_like(X, dtype=np.int)for whlist in range(X.shape[1]):arr[:, whlist] = encoder.fit_transform(X[:, whlist])return arr

2.4.8 变量数据处理方式划分;

图1-20

代码如下:

from sklearn.model_selection import train_test_split# 如果为监督学习则需要复制标签,如果无监督学习则不需要下方复制标签的代码data2_labels = data2["end_pay_off_flag"].copy() # 复制标签data2.drop(["end_pay_off_flag"], axis=1,inplace=True) # 删除逾期标签# 30%数据做测试集Xtrain, Xtest, Ytrain, Ytest = train_test_split(data2, data2_labels, test_size=0.3, random_state=42)Xtrain

源码分析:

1.导入train_test_split函数,该函数用于划分数据集为训练集和测试集。

2.根据注释中的说明,如果是监督学习任务,则需要复制标签列,如果是无监督学习任务,则不需要复制标签列。在这里,假设是监督学习任务,因此需要复制标签列。

3.通过data2["end_pay_off_flag"].copy()将标签列("end_pay_off_flag")复制到data2_labels变量中。

4.使用data2.drop(["end_pay_off_flag"], axis=1, inplace=True)从data2数据集中删除标签列,即在原始数据集上进行修改。

调用train_test_split函数,并传入以下参数:

  1. data2:要划分的特征数据集。
  2. data2_labels:复制的标签数据集。
  3. test_size=0.3:测试集的比例为30%。
  4. random_state=42:设置随机种子,以确保每次划分的结果都相同。

函数返回四个数据集:

  1. Xtrain:训练集的特征数据。
  2. Xtest:测试集的特征数据。
  3. Ytrain:训练集的标签数据。
  4. Ytest:测试集的标签数据。

2.4.9 拼接数据处理流水线.

图1-21

图1-22

代码如下:

from sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.pipeline import FeatureUnion# 定义连续型数据处理的Pipelinenum_pipeline = Pipeline([('selector', DataFrameSelector(list_train_num)),  # 选择连续型特征('simple_imputer', SimpleImputer(strategy="mean")),  # 填充缺失值('std_scaler', StandardScaler()),  # 标准化数据])# 定义离散型数据处理的Pipelinecat_pipeline = Pipeline([('selector', DataFrameSelector(list_train_str)),  # 选择离散型特征('label_encoder', ExeLabelEncoder()),  # 使用ExeLabelEncoder将数据转换为数字])# 定义需要进行One-Hot编码的离散型数据处理的Pipelinecat_onehot_pipeline = Pipeline([('selector', DataFrameSelector(list_train_str_needtrf)),  # 选择需要进行One-Hot编码的离散型特征('cat_encoder', CategoricalEncoder(encoding="onehot-dense")),  # 使用CategoricalEncoder进行One-Hot编码])# 定义FeatureUnion,将连续型、离散型和One-Hot编码的数据处理Pipeline合并full_pipeline = FeatureUnion(transformer_list=[("num_pipeline", num_pipeline),("cat_pipeline", cat_pipeline),("cat_onehot_pipeline", cat_onehot_pipeline)])# 使用full_pipeline对训练集Xtrain进行数据清洗和处理,并返回处理后的数据集df_select_prepared = full_pipeline.fit_transform(Xtrain)df_select_prepared.shape  # 查看清洗后的数据维度(行列数)

源码分析:

定义了多个Pipeline,用于对不同类型的特征进行数据清洗和处理。

        1.num_pipeline是用于连续型数据的Pipeline,包括以下处理步骤:

  1. selector:选择连续型特征,使用DataFrameSelector进行选择。
  2. simple_imputer:填充缺失值,使用SimpleImputer,采用平均值策略。
  3. std_scaler:标准化数据,使用StandardScaler进行标准化。

        2.cat_pipeline是用于离散型数据的Pipeline,包括以下处理步骤:

  1. selector:选择离散型特征,使用DataFrameSelector进行选择。
  2. label_encoder:将离散型数据转换为数字,使用ExeLabelEncoder进行转换。

        3.cat_onehot_pipeline是用于需要进行One-Hot编码的离散型数据的Pipeline

最后,使用FeatureUnion将上述三个Pipeline合并成一个整体的数据处理Pipeline,并命名为full_pipeline。打印df_select_prepared.shape,输出清洗后的数据维度(行列数)。


2.5 实验心得

通过这次实验,深度领略了使用机器学习库进行数据清洗的奥妙。成功搭建了机器学习的基石,包括NumPy、Pandas、Scikit-learn等,同时搭建了Python、Jupyter Notebook等运行环境。

在实验中,探索了数据清洗的精髓和关键步骤,明白了数据清洗的不可或缺。这一过程帮助我们从原始数据中剔除不准确、不完整或不适合模型的记录,确保数据准确、可靠、适合训练模型,并发现纠正数据中的错误、缺失和不一致,提升数据的质量和准确性。

在清洗过程中,遇到了不同情况下的数据问题,如唯一性、同义异名、数据类型不匹配以及连续型变量的缺失值等。针对这些问题,采取了相应的清洗步骤。

首先,剔除了缺失率过高的变量,提高后续分析和模型训练的效率。然后,清理了不需要入模的变量,以提高模型效率和准确性。接着,删除了文本型变量中存在缺失值的行,修复了变量的类型,确保每个变量都具有正确的数据类型。

在数据处理方式阶段,根据变量类型和处理方式将数据分为不同类别,为每个类别选择了相应的数据处理方法,例如标准化、归一化等。这样可根据不同变量特点更准确、合理地处理数据。

最后,将数据分为训练集和测试集,以进行模型训练和性能评估。为简化整个数据清洗流程,创建了一个数据处理流水线,整合了不同处理步骤,方便未来的数据分析任务中重复使用。通过实验,深刻领会了数据清洗的原理和步骤,认识到了在实际数据分析工作中的不可或缺性。


致读者

风自火出,家人;君子以言有物而行有恒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/141617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Airflow (六) :DAG catchup 参数设置

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹…

从0到0.01入门React | 010.精选 React 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【C/PTA——8.数组2(课外实践)】

C/PTA——8.数组2&#xff08;课外实践&#xff09; 7-4 矩阵运算7-2 方阵循环右移7-3 螺旋方阵7-4 数组-杨辉三角7-5 数组-对角线求和7-6 数组-矩阵最小值 7-4 矩阵运算 #include<stdio.h> int main() {int n, i, j;int a[10][10] { 0 };scanf("%d", &n)…

电脑技巧:推荐基于浏览器的远程桌面访问控制工具

一、软件简介 Getscreen.me是一个基于浏览器的远程桌面访问控制工具&#xff0c;可以轻松地远程访问控制特定设备。并且注册登录账户实现允许设置具有永久访问权限的设备&#xff0c;可以通过一键进行快速连接访问&#xff0c;无需共享 ID、密码或任何内容。 Getscreen.me采用…

Linux可以投屏到电视吗?用网页浏览器就能投屏到电视!

Linux系统的电脑如果要投屏到安卓电视屏幕上&#xff0c;可以使用投屏工具AirDroid Cast的网页版和TV版一起实现。 首先&#xff0c;在Linux系统的电脑里用chrome浏览器或edge浏览器打开webcast.airdroid.com。这就是AirDroid Cast的网页版。你可以看到中间白色框框的右上角有个…

ARPG----C++学习记录04 Section8 角色类,移动

角色类输入 新建一个角色C&#xff0c;继承建立蓝图,和Pawn一样&#xff0c;绑定输入移动和相机. 在构造函数中添加这段代码也能实现。打开UsePawnControlRotation就可以让人物不跟随鼠标旋转 得到旋转后的向前向量 使用旋转矩阵 想要前进方向和旋转的方向对应。获取当前控制…

2.3 Windows驱动开发:内核字符串转换方法

在内核编程中字符串有两种格式ANSI_STRING与UNICODE_STRING&#xff0c;这两种格式是微软推出的安全版本的字符串结构体&#xff0c;也是微软推荐使用的格式&#xff0c;通常情况下ANSI_STRING代表的类型是char *也就是ANSI多字节模式的字符串&#xff0c;而UNICODE_STRING则代…

图论14-最短路径-Dijkstra算法+Bellman-Ford算法+Floyed算法

文章目录 0 代码仓库1 Dijkstra算法2 Dijkstra算法的实现2.1 设置距离数组2.2 找到当前路径的最小值 curdis&#xff0c;及对应的该顶点cur2.3 更新权重2.4 其他接口2.4.1 判断某个顶点的连通性2.4.2 求源点s到某个顶点的最短路径 3使用优先队列优化-Dijkstra算法3.1 设计内部类…

Vue 小黑记事本组件板

渲染功能&#xff1a; 1.提供数据&#xff1a; 提供在公共的父组件 App.vue 2.通过父传子&#xff0c;将数据传递给TodoMain 3.利用 v-for渲染 添加功能&#xff1a; 1.收集表单数据 v-model 2.监听事件&#xff08;回车点击都要添加&#xff09; 3.子传父&#xff0c;讲…

Redis解决缓存问题

目录 一、引言二、缓存三、Redis缓存四、缓存一致性1.缓存更新策略2.主动更新 五、缓存穿透六、缓存雪崩七、缓存击穿1.基于互斥锁解决具体业务2.基于逻辑过期解决具体业务 一、引言 在一些大型的网站中会有十分庞大的用户访问流量&#xff0c;而过多的用户访问对我们的MySQL数…

原生JS实现视频截图

视频截图效果预览 利用Canvas进行截图 要用原生js实现视频截图&#xff0c;可以利用canvas的绘图功能 ctx.drawImage&#xff0c;只需要获取到视频标签&#xff0c;就可以通过drawImage把视频当前帧图像绘制在canvas画布上。 const video document.querySelector(video) con…

Nginx 使用笔记大全(唯一入口)

Linux服务器因为Nginx日志access.log文件过大项目无法访问 项目处于运行状态下无法访问&#xff0c;第一步查看磁盘状态 1、查看磁盘状态 df -h 2、查找100M以上的文件 find / -size 100M |xargs ls -lh 3、删除文件 rm -rf /usr/local/nginx/logs/access.log 4、配置nginx.…

LabVIEW中如何在网络上使用远程VI服务器

LabVIEW中如何在网络上使用远程VI服务器 如何在网络上使用远程VI服务器&#xff1f; 解答: 首先&#xff0c;需要在远程的计算机上打开一个在VI服务器上的LabVIEW应用程序的引用。这可以通过“Open ApplicationReference“函数实现。然后用“Open VI Reference”函数打开一个…

Js 保留关键字

JavaScript 关键字用于标识要执行的操作&#xff0c;和其他任何编程语言一样&#xff0c;JavaScript 保留了一些关键字为自己所用&#xff1b;这些关键字有些在目前的版本中可能没有使用&#xff0c;但在以后 JavaScript 扩展中会用到。 以下是JS中最重要的保留关键字&#xf…

【数据结构】堆(Heap):堆的实现、堆排序

目录 堆的概念及结构 ​编辑 堆的实现 实现堆的接口&#xff1a; 堆的初始化&#xff1a; 堆的打印&#xff1a; 堆的销毁&#xff1a; 获取最顶的根数据&#xff1a; 交换&#xff1a; 堆的插入&#xff1a;&#xff08;插入最后&#xff09; 向上调整&#xff1a;&#xff0…

Linux---(六)自动化构建工具 make/Makefile

文章目录 一、make/Makefile二、快速查看&#xff08;1&#xff09;建立Makefile文件&#xff08;2&#xff09;编辑Makefile文件&#xff08;3&#xff09;解释&#xff08;4&#xff09;效果展示 三、背后的基本知识、原理&#xff08;1&#xff09;如何清理对应的临时文件呢…

layui table合并相同的列

table.render({elem: #samples,url: /index/Develorderss/samplelists?od_idod_id //数据接口,page: { //支持传入 laypage 组件的所有参数&#xff08;某些参数除外&#xff0c;如&#xff1a;jump/elem&#xff09; - 详见文档layout: [prev, page, next, count,skip,limit]…

vmware 修改主机名称 hadoop 服务器环境配置(一)

如何在虚拟机配置主机名称&#xff1a; 1. 如图所示在/etc 文件夹下有个hosts文件。追加映射关系&#xff1a; #关系 ip地址 名称 192.168.164.20 hadoop20 2. 保存后&#xff0c;重启reboot即可

东莞松山湖数据中心|莞服务器托管的优势

东莞位于珠江三角洲经济圈&#xff0c;交通便利&#xff0c;与广州、深圳等大城市相邻&#xff0c;而且东莞是中国重要的制造业基地&#xff0c;有众多的制造业和科技企业集聚于此&#xff0c;随着互联网和数字化时代的到来&#xff0c;企业都向数字化转型&#xff0c;对于信息…

汽车一键启动智能系统功能作用

在现代科技的推动下&#xff0c;我们的生活每天都在发生着变化。其中&#xff0c;汽车智能一键启动系统就是科技改变生活的最好例子之一。 首先&#xff0c;我们来简单了解一下汽车智能一键启动系统。它是一种利用先进的电子技术和无线通信技术&#xff0c;实现无需钥匙即可启…