对各种数据类型进行排序 sort any type data

本文介绍如何通过函数模板实现对不同类型的数组进行排序,利用模板简化代码,提高复用性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 通常要是闲一组数据的排序要创建一个函数,而实现另外一组类类型的数据排序时又要创建一个函数,但是如果使用函数模板就可以通过一个函数来实现。本实例将通过函数模板实现不同类型数据的排序。

函数模板的声明方式如下:

template <class T>

下面给出一个具体的函数:

/*******************************************        Sort any tpye array          *******************************/
/***************************************************************************************************************/
/*Author: TianLiang                                                                                            */
/*Time: 2011/10/29                                                                                            */
/*Function: A template to sort any type of array                                                               */

template <class Type>  //Define a template
void CCalculateSimilarity::Sort(Type Array[], int nLen)
{
	Type nTmp;
	for(int i=0;i<nLen-1;i++) //起泡法排序
	{
		for(int j=0;j<nLen-i-1;j++)
		{
			if(Array[j]>Array[j+1]) //Exchange the data
			{
				nTmp=Array[j];
				Array[j] = Array[j+1];
				Array[j+1]=nTmp;
			}
		}

	}
	//return Array[nLen];

}


    

<think>我们有一个DataFrame,包含四列:a,b,c,d。要求将a列作为行索引,b作为第一层列索引,c作为第二层列索引,d作为数据。然后画热力图,并根据值的大小填充不同的颜色。此外,纵坐标(行索引)需要按值从大到小排序,且数据为整数类型。步骤:1.创建示例数据(如果用户没有提供的话,这里我们假设用户会用自己的数据,但为了演示,我们创建示例数据)2.重塑数据:使用pivot_table,设置index为a,columns为[b,c],values为d。注意,由于可能存在重复项,我们需要选择一个聚合函数,比如取平均值、最大值或第一个值等。根据题意,这里我们取第一个值(因为要求数据为int,且没有说明重复如何处理,但通常透视表需要处理重复)。如果实际数据没有重复,那么使用'first'或'any'都可以。但为了通用,我们假设可能有重复,所以这里我们选择使用'mean'(因为题目没有说明,但要求按值排序,所以用平均值可能更合理)?但是题目要求数据为int,且要求按值排序,这里我们按题意,如果用户要求按值排序,我们可能需要对行进行排序。3.排序:题目要求纵坐标(行索引)按值从大到小排序。注意,这里是指按行索引对应的值排序?还是按行中的某个值排序?实际上,题目没有明确说明按什么值排序,但通常我们可能希望按行汇总的值(比如行平均值)来排序。这里我们假设按行中所有数据的平均值从大到小排序。4.绘制热力图:使用seaborn的heatmap函数。但是,注意:题目要求“纵坐标按值从大到小排序”,这个“值”指的是什么?有两种理解:a)行索引本身的值(比如行索引是字符串,那么按字符串排序?)但题目要求按值,且数据为int,所以行索引可能是整数?但题目中a列作为行索引,并没有说明a列是数值还是字符串。所以这里我们假设a列是字符串,而排序是按行中所有数值的平均值从大到小排序。5.数据为int:我们确保在透视表中,如果使用聚合函数,得到的是整数?但聚合函数(如mean)可能会产生浮点数。所以如果要求整数,我们可以使用其他聚合函数(如sum、max、min等)?但是题目没有明确。这里我们根据题意,在绘制热力图时,我们使用整数格式显示(fmt='d'),但前提是数据确实是整数。如果聚合后是浮点数,我们可以四舍五入取整,但题目没有说明,所以我们先按原数据绘制,然后设置fmt为整数格式(但这样会去掉小数部分,可能会四舍五入?)。实际上,我们可以在聚合后转换为整数,但这样会丢失精度。因此,我们需要明确:由于题目要求数据为int,我们在透视表时,如果存在重复,需要选择一种聚合方式使得结果为整数(比如使用'sum',但是这样可能不合理,因为重复项求和可能不是原意)。另一种方法是,如果存在重复,我们取第一个,然后转换为整数?但这样可能会忽略重复项。所以最好的办法是,在数据准备阶段,确保每个(a,b,c)组合只有一个值?或者用户明确如何处理重复。根据题目要求,我们假设数据没有重复,或者用户指定了聚合函数(这里我们使用'first',并转换为整数,因为题目要求数据为int)。因此,步骤调整如下:1.创建数据(示例)2.使用pivot_table,设置aggfunc='first'(这样每个单元格只有一个值,然后我们可以转换为整数?但pivot_table返回的是浮点类型,如果有NaN的话。所以我们可以用astype(int)转换,但NaN不能转换,所以需要先填充?或者我们不用转换,在热力图显示时用整数格式即可。3.对行进行排序:计算每行的平均值(忽略NaN),然后按平均值从大到小排序。4.绘制热力图,设置fmt='d'(整数格式),但如果数据是NaN,则显示为空,整数格式会显示为空白。具体代码:注意:如果数据中有NaN,在排序时我们需要忽略NaN。使用nanmean。示例代码:</think># 按值排序的热力图实现 我将创建一个热力图,其中纵坐标按值从大到小排序,数据使用整数类型。以下是完整解决方案: ```python import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap # 创建示例数据(包含整数) data = { 'a': ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10'], 'b': ['B1', 'B1', 'B2', 'B2', 'B3', 'B3', 'B1', 'B2', 'B3', 'B1'], 'c': ['C1', 'C2', 'C1', 'C2', 'C1', 'C2', 'C1', 'C2', 'C1', 'C2'], 'd': [85, 92, 78, 88, 95, 82, 90, 76, 89, 93] # 整数数据 } df = pd.DataFrame(data) # 重塑数据为多层索引透视表 pivot_df = df.pivot_table( index='a', columns=['b', 'c'], values='d', aggfunc='mean', # 使用平均值处理可能的重复项 fill_value=np.nan ).astype('Int64') # 转换为整数类型,保留NaN # 计算每行的平均值(用于排序) row_means = pivot_df.mean(axis=1, skipna=True) # 按行平均值从大到小排序 sorted_indices = row_means.sort_values(ascending=False).index sorted_df = pivot_df.loc[sorted_indices] # 创建自定义颜色映射(整数专用) colors = ["#FF0000", "#FFFF00", "#00FF00"] # 红 -> 黄 -> 绿 cmap = LinearSegmentedColormap.from_list("custom_gradient", colors) # 创建热力图 plt.figure(figsize=(12, 8)) heatmap = sns.heatmap( sorted_df, annot=True, # 显示数值 fmt="d", # 整数格式 cmap=cmap, # 自定义颜色映射 linewidths=1, # 单元格边框 linecolor='white', # 边框颜色 cbar_kws={ 'label': 'Score', 'ticks': range(70, 101, 5) # 自定义颜色刻度 }, vmin=70, # 颜色映射最小值 vmax=100 # 颜色映射最大值 ) # 设置标题和标签 plt.title('Sorted Heatmap with Integer Values', fontsize=16, pad=20) plt.xlabel('(First Level: b, Second Level: c)', fontsize=12) plt.ylabel('Row Index (a) - Sorted by Value', fontsize=12) # 优化标签显示 heatmap.set_xticklabels( heatmap.get_xticklabels(), rotation=45, ha="right", fontsize=10 ) # 添加排序信息注释 sorted_values = sorted(row_means, reverse=True) for i, val in enumerate(sorted_values): plt.text( -1.5, i + 0.5, f'Avg: {val:.1f}', ha='right', va='center', fontsize=9 ) plt.tight_layout() plt.savefig('sorted_heatmap.png', dpi=300) # 保存高分辨率图片 plt.show() ``` ## 关键实现细节 ### 1. 数据整形与类型转换 ```python pivot_df = df.pivot_table(...).astype('Int64') ``` - 使用`pivot_table`创建多层索引透视表 - `astype('Int64')`确保数据为整数类型(Pandas的Int64类型支持NaN) ### 2. 按值排序实现 ```python row_means = pivot_df.mean(axis=1, skipna=True) sorted_indices = row_means.sort_values(ascending=False).index sorted_df = pivot_df.loc[sorted_indices] ``` - 计算每行的平均值(忽略NaN) - 按平均值从大到小排序 - 根据排序后的索引重新排列DataFrame ### 3. 自定义整数热力图 ```python # 自定义颜色映射 colors = ["#FF0000", "#FFFF00", "#00FF00"] cmap = LinearSegmentedColormap.from_list("custom_gradient", colors) # 热力图参数 sns.heatmap( ..., fmt="d", # 整数格式显示 cmap=cmap, # 红--绿渐变 vmin=70, # 最小值 vmax=100 # 最大值 ) ``` - 使用`fmt="d"`确保显示整数格式 - 自定义颜色映射从红(低)到绿(高) - 设置`vmin`和`vmax`固定颜色映射范围 ### 4. 排序信息标注 ```python for i, val in enumerate(sorted_values): plt.text( -1.5, i + 0.5, f'Avg: {val:.1f}', ... ) ``` - 在左侧添加每行的平均值 - 帮助理解排序依据 ## 效果说明 1. **行排序**:纵坐标按行平均值从大到小排列 2. **整数显示**:所有值显示为整数格式 3. **颜色编码**:使用红--绿渐变表示值大小 4. **多层列索引**:b列作为第一层索引,c列作为第二层索引 5. **排序依据**:左侧显示每行平均值,说明排序依据 ![Sorted Heatmap with Integer Values](https://via.placeholder.com/800x600?text=Sample+Heatmap+Image)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值