如何在NumPy数组中找出满足多优化准则的行索引?
多准则优化筛选NumPy数组最优行
给定的NumPy数组如下:
import numpy as np example = np.array([[1.5525672727035909, 0.9550488599348534, 0.04495114006514658, -4757.845003575899, -4747.172432255857, 1], [1.3050643768242065, 0.962214983713355, 0.03778501628664495, -5024.418466943938, -5013.745895623896, 2], [1.3950687447554788, 0.9596091205211726, 0.040390879478827364, -4922.047207088476, -4911.374635768434, 3], [1.2375603195101852, 0.9641693811074918, 0.035830618892508145, -5105.942048800849, -5095.269477480807, 4], [1.2375603195101852, 0.9641693811074918, 0.035830618892508145, -5105.942048800849, -5095.269477480807, 5], [1.2375597985998075, 0.9641693811074918, 0.035830618892508145, -5105.942048800849, -5095.269477480807, 6], [1.2375597985998072, 0.9641693811074918, 0.035830618892508145, -5105.942048800849, -5095.269477480807, 7], [1.215059487982556, 0.9648208469055375, 0.03517915309446254, -5134.107976656531, -5123.435405336489, 8], [1.1250535573201497, 0.9674267100977199, 0.03257328990228013, -5252.243174800487, -5241.570603480445, 9], [1.1250551200512835, 0.9674267100977199, 0.03257328990228013, -5252.243174800487, -5241.570603480445, 10]])
需要筛选满足以下准则的最优行:
- 第1列数值越接近0越好
- 第2列数值越接近100越好
- 第3、4列数值越远离0越好
解决方案步骤
1. 数据标准化
由于各列数值范围差异极大(比如第2列在0-1区间,第4列在-5000左右),直接计算得分会导致范围大的列主导结果,先对每列做min-max标准化,将所有值映射到[0,1]区间:
# 提取前5列数据(排除最后一列索引) data = example[:, :5] # 定义min-max标准化函数 def min_max_scaler(arr): return (arr - arr.min()) / (arr.max() - arr.min()) # 逐列标准化 scaled_data = np.apply_along_axis(min_max_scaler, axis=0, arr=data)
2. 转换为准则得分
根据每个准则的优化方向,将标准化后的值转换为得分(得分越高越符合准则):
# 第1列:越接近0得分越高 score_col1 = 1 - scaled_data[:, 0] # 第2列:原数据远小于100,按"越接近当前最大值越好"计算得分;若严格要接近100,见补充说明 score_col2 = scaled_data[:, 1] # 第3列:越远离0得分越高(原数据均为正数,值越大离0越远) score_col3 = scaled_data[:, 2] # 第4列:取绝对值后标准化,代表离0的距离,值越大得分越高 col4_abs = np.abs(data[:, 3]) col4_scaled = min_max_scaler(col4_abs) score_col4 = col4_scaled
3. 加权综合得分
根据各准则的优先级分配权重(权重和为1),比如四个准则权重均等:
# 可根据需求调整权重,比如给第2列更高权重 weights = np.array([0.25, 0.25, 0.25, 0.25]) # 计算每行综合得分 scores = np.array([score_col1, score_col2, score_col3, score_col4]).T @ weights
4. 筛选最优行
找到综合得分最高的行,输出其原索引:
# 获取所有最高分的行索引 max_score_pos = np.where(scores == scores.max())[0] # 输出对应的原数组行索引 best_indices = example[max_score_pos, -1] print("最优行索引:", best_indices)
补充说明
- 若严格要求第2列接近100,可修改第2列得分计算:
target_col2 = 100 col2_dist = np.abs(data[:, 1] - target_col2) col2_dist_scaled = min_max_scaler(col2_dist) score_col2 = 1 - col2_dist_scaled - 若需避免异常值影响,可替换为Z-score标准化:
def z_score_scaler(arr): return (arr - arr.mean()) / arr.std()
内容的提问来源于stack exchange,提问作者Unai Vicente
相关产品推荐
相关产品推荐

