You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中找到最大行列式组合后删除数据集对应行的实现

问题描述

咱们的需求很明确:当设定N=7时,从数据集M里提取出矩阵Y(包含前8行数据,第一列为索引ID);接着从Y的所有7行组合里,找出能让A[s].T@A[s]行列式值最大的组合来生成矩阵Z;最后要定位出被排除的那一行(比如示例里的ID474),并从原数据集M中删除该行,用精简后的M做后续循环计算。

现有代码及输出

原始代码

import pandas as pd
import numpy as np
import itertools as it
import io
def brute_force(A):
    return max(map(list,it.combinations(range(len(Y)),N)), key=lambda s: np.linalg.det(A[s].T@A[s]))
data ='''
ID,M,N,O,P,Q,R
5362,0.974,-0.404,-0.763,0.868,-0.5,0.16
485,-0.659,0.531,0.623,0.402,0.772,0.506
582,0.045,0.994,0.762,-0.036,0.117,-0.355
99,0.777,0.537,0.391,0.456,0.329,0.108
75,-0.44,0.522,0.856,-0.04,0.656,-0.935
474,0.357,0.81,0.135,0.389,0.055,0.224
594,-0.291,0.031,0.742,-0.332,0.815,0.983
597,0.968,-0.357,0.591,0.892,0.375,0.88
124,0.737,0.611,0.764,0.289,0.298,-0.705
635,0.883,0.96,-0.987,0.29,0.997,0.186
7894,-0.045,0.047,0.523,0.068,-0.9,0.356
1268,0.561,0.736,-0.375,0.465,0.908,0.2
38,0.465,0.623,0.734,0.145,0.489,0.759
88,0.029,0.166,0.098,0.285,0.18,0.829
887,0.464,0.652,-0.896,0.07,0.772,-0.268
994,-0.611,0.986,0.708,-0.195,0.938,0.166
478,0.109,0.664,0.977,0.2,-0.466,0.676
693,0.893,0.536,0.827,0,0.658,-0.31
455,0.745,0.851,0.025,0.667,0.094,0.127
874,0.036,-0.212,0.879,0.966,0.788,0.719
417,0.316,0.553,0.872,-0.274,0.946,0.238
44,0.517,-0.113,0.992,0.521,0.595,0.674
101,0.699,0.095,0.269,0.628,-0.711,-0.141
60,0.993,0.348,-0.44,0.807,0.013,0.325
8741,-0.319,0.535,0.717,-0.89,0.334,0.279
9635,0.363,0.812,0.77,0.715,0.34,0.327
2563,0.649,-0.788,0.405,0.056,0.25,0.08
5463,0.491,0.414,0.084,0.173,0.397,-0.499
1044,-0.669,0.288,0.424,-0.324,0.491,-0.581
999,0.208,0.082,-0.425,0.916,0.582,0.45
'''
df = pd.read_csv(io.StringIO(data),index_col=0)
M = df.iloc[:,:]
N = int(input( '\nNo. of rows: '))
Y = M.iloc[0 : N+1 ,:]
print(Y.index)
YB = brute_force(Y.to_numpy())
Z = Y.iloc[YB]
print(Z.index)

运行输出

No. of rows: 7
Y.index : Int64Index([5362, 485, 582, 99, 75, 474, 594, 597], dtype='int64', name='ID')
Z.index : Int64Index([5362, 485, 582, 99, 75, 594, 597], dtype='int64', name='ID')

从输出能清晰看到,ID474没有出现在Z的索引里,这就是咱们要从M中删除的目标行。

补充删除逻辑的完整代码

我们只需要在现有代码基础上,添加几行逻辑来定位并删除目标行即可。下面是修改后的完整代码:

import pandas as pd
import numpy as np
import itertools as it
import io

def brute_force(A, n_rows):
    # 将需要的行数作为参数传入,避免依赖全局变量
    return max(map(list, it.combinations(range(len(A)), n_rows)), 
               key=lambda s: np.linalg.det(A[s].T @ A[s]))

data ='''
ID,M,N,O,P,Q,R
5362,0.974,-0.404,-0.763,0.868,-0.5,0.16
485,-0.659,0.531,0.623,0.402,0.772,0.506
582,0.045,0.994,0.762,-0.036,0.117,-0.355
99,0.777,0.537,0.391,0.456,0.329,0.108
75,-0.44,0.522,0.856,-0.04,0.656,-0.935
474,0.357,0.81,0.135,0.389,0.055,0.224
594,-0.291,0.031,0.742,-0.332,0.815,0.983
597,0.968,-0.357,0.591,0.892,0.375,0.88
124,0.737,0.611,0.764,0.289,0.298,-0.705
635,0.883,0.96,-0.987,0.29,0.997,0.186
7894,-0.045,0.047,0.523,0.068,-0.9,0.356
1268,0.561,0.736,-0.375,0.465,0.908,0.2
38,0.465,0.623,0.734,0.145,0.489,0.759
88,0.029,0.166,0.098,0.285,0.18,0.829
887,0.464,0.652,-0.896,0.07,0.772,-0.268
994,-0.611,0.986,0.708,-0.195,0.938,0.166
478,0.109,0.664,0.977,0.2,-0.466,0.676
693,0.893,0.536,0.827,0,0.658,-0.31
455,0.745,0.851,0.025,0.667,0.094,0.127
874,0.036,-0.212,0.879,0.966,0.788,0.719
417,0.316,0.553,0.872,-0.274,0.946,0.238
44,0.517,-0.113,0.992,0.521,0.595,0.674
101,0.699,0.095,0.269,0.628,-0.711,-0.141
60,0.993,0.348,-0.44,0.807,0.013,0.325
8741,-0.319,0.535,0.717,-0.89,0.334,0.279
9635,0.363,0.812,0.77,0.715,0.34,0.327
2563,0.649,-0.788,0.405,0.056,0.25,0.08
5463,0.491,0.414,0.084,0.173,0.397,-0.499
1044,-0.669,0.288,0.424,-0.324,0.491,-0.581
999,0.208,0.082,-0.425,0.916,0.582,0.45
'''
df = pd.read_csv(io.StringIO(data), index_col=0)
M = df.copy()  # 复制原数据集,避免修改原始DataFrame

N = int(input('\nNo. of rows: '))
Y = M.iloc[0 : N+1, :]
print(f"Y.index : {Y.index}")

# 调用函数时传入参数,避免全局变量依赖
YB = brute_force(Y.to_numpy(), N)
Z = Y.iloc[YB]
print(f"Z.index : {Z.index}")

# 找出被省略的行ID
dropped_ids = Y.index.difference(Z.index)
print(f"被省略的行ID: {dropped_ids.tolist()}")

# 从原数据集M中删除该行
M = M.drop(dropped_ids)
print(f"精简后的M的行数: {len(M)}")

代码说明

  • 我调整了brute_force函数,把需要选择的行数作为参数传入,避免了全局变量的依赖,让代码更健壮易维护。
  • 通过Y.index.difference(Z.index)可以快速找出Y中不在Z里的索引,也就是要删除的目标行ID。
  • 用M.drop(dropped_ids)完成删除操作,得到精简后的M,后续就可以直接用这个数据集进行循环计算了。

运行验证

当输入N=7时,会输出:

No. of rows: 7
Y.index : Int64Index([5362, 485, 582, 99, 75, 474, 594, 597], dtype='int64', name='ID')
Z.index : Int64Index([5362, 485, 582, 99, 75, 594, 597], dtype='int64', name='ID')
被省略的行ID: [474]
精简后的M的行数: 29

可以看到,原M有30行,删除ID474后剩下29行,完全符合预期。

内容的提问来源于stack exchange,提问作者axay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:33:01