python - 根据 Numpy 数组其他列中的约束查找列的 argmax()

标签 python arrays numpy

我的问题非常简单,可能有一种非常简单的方法可以解决这个问题,但我找不到。因此,首先,我连接一些数组,然后我想找到第一列和第二列(data_x1,data_x2)的组合,该组合返回 y 的最大值。但是,有一个约束,我想将所有x限制在-20到20之间,如果大于20或小于-20,我想忽略这个值。

而且我在函数内使用这个过程,因此我真的在寻找一种可以适用于 n 个“x”的方法。总结:我想找出受约束的 data_x1 和 data_x2 的最优 y,这意味着 data_y 行中的最优值对应于受上述条件限制的 data_x1 和 data_x2 的值( < 20 和 > - 20)。例如,在我提供的这个数据集中,包含最大 data_y 的行超出了我施加的条件。例如,当我尝试时:

y_max = data_y.max()   
ID = data_y.argmax()
x1_max = data_x1[ID]
x2_max = data_x2[ID]

我的 x2_2 会超出我想要施加的限制。

这是数据集:

data_x1 = np.array([ 7.50581267e-01,  4.85312598e+00, -1.37035821e+00, -1.27199171e-03,
       -1.61347902e+00, -2.47705419e+00,  1.54149227e-01,  2.96462913e+00,
        6.39336584e+00,  2.22526551e+00, -3.13825557e+00, -4.53521105e+00,
        3.66632759e+00,  6.95980810e-01, -2.08555389e+00, -3.42268057e+00,
       -2.67733126e+00,  3.44611056e+00, -3.21242281e-01, -4.45557410e+00,
        2.36357280e+00,  6.76143624e-01, -1.12756068e+00,  1.56898158e+00,
       -2.73721604e+00,  2.63754963e+00, -4.52874687e+00, -2.96449234e+00,
       -4.38481329e+00, -1.50384134e+00, -2.52651726e+00, -1.34210192e+00,
       -2.39860669e-01,  1.40859346e+00,  1.85432054e-01,  5.01414945e-01,
        4.55880766e+00, -1.05363585e+00, -4.62917198e+00,  2.59998127e+00,
        5.25344447e+00,  3.07701918e-01,  2.26443850e+00, -2.22101423e+00,
        3.02861897e-01,  1.65691179e+00,  8.81562566e-01, -1.87325712e+00,
        4.63772521e+00,  2.64284088e-01,  2.53643045e+00,  9.63172795e-01,
        2.36685850e+00,  2.54559573e+00, -9.02629613e-01,  2.24687227e+00,
        6.22720302e+00,  5.74281188e+00,  2.03796010e+00,  4.80760151e+00])


data_x2 = np.array([-30.09938636, -28.83362992, -22.57425202, -23.14358566,
       -33.59852454, -27.51674098, -30.7885103 , -25.90249062,
       -22.08337401, -29.07237476, -23.04023689, -30.30583811,
       -21.00309374, -29.99686696, -28.90991919, -26.62903318,
       -31.72168863, -22.87107873, -30.729956  , -25.6780506 ,
       -31.38729541, -27.19055645, -27.55148381, -28.68462801,
       -26.05224771, -30.87040206, -22.95430799, -26.91256322,
       -35.8942374 , -21.50322056, -26.16176442, -22.85920962,
       -28.05071496, -34.30775127, -28.7790589 , -31.19811517,
       -27.63535267, -28.96808588, -26.89286845, -32.81312953,
       -27.35855807, -28.89865079, -25.61937868, -32.59681293,
       -28.79511822, -22.54470727, -31.06309398, -25.30574423,
       -23.52838694, -27.55017459, -24.55437336, -24.39558638,
       -22.81063876, -28.62340189, -27.85680254, -25.10753673,
       -29.75683744, -27.37575317, -29.61561727, -34.50702866]

data_y = np.array([2511661.54014723, 2506471.03096404, 2496512.87703406,
       2500666.09145807, 2492786.42701569, 2513191.79101637,
       2509515.1829362 , 2509970.89367091, 2481463.90896938,
       2512505.17266542, 2496999.56860772, 2503950.65803291,
       2481665.31885133, 2511985.61283778, 2512968.70827174,
       2510599.791468  , 2502795.50006905, 2495342.7106848 ,
       2509708.93248061, 2505715.61726413, 2504986.68522465,
       2514933.54167635, 2514835.36052355, 2513916.01349115,
       2510784.07070835, 2506718.40944214, 2493199.57962053,
       2511925.51820147, 2466117.27254433, 2488828.88557003,
       2511417.16267116, 2498364.67720219, 2515221.17931068,
       2487471.40157182, 2514636.01655828, 2507757.43933369,
       2508292.40113149, 2514000.76143246, 2507722.80700035,
       2496671.63747914, 2505965.77313117, 2514453.85665244,
       2510375.19913626, 2498705.33749204, 2514595.64115671,
       2496054.0775116 , 2508144.96504256, 2509901.46588431,
       2496183.49020786, 2515239.10310988, 2506016.58240813,
       2507055.51518852, 2496891.65309883, 2512606.04865712,
       2515010.58385846, 2508707.73815183, 2499240.78218084,
       2504177.72406016, 2511686.21461949, 2477825.15797829])

尽管解释很长,但希望我能够做到简洁和准确。我非常感谢您在这方面的帮助!

最佳答案

您的 data_x2 不包含 -20 到 20 之间的值。

如果您可以使用 pandas 来实现此目的,则可以(例如 -30 < x < 30)

import pandas as pd
df = pd.DataFrame({'x1': data_x1, 'x2': data_x2, 'y': data_y})
df = df[df['x1'].between(-30, 30, inclusive=False) & df['x2'].between(-30, 30, inclusive=False)]

df.sort_values(by='y', ascending=False).iloc[0]
Output: 
x1    2.642841e-01
x2   -2.755017e+01
y     2.515239e+06
Name: 49, dtype: float64

这是一个用于计算此值的函数。 (再次使用pandas)

def func(x1, x2, y, lower_bound, upper_bound):
    df = pd.DataFrame({'x1': x1, 'x2': x2, 'y': y})
    df = df[df['x1'].between(lower_bound, upper_bound, inclusive=False) & df['x2'].between(lower_bound, upper_bound, inclusive=False)]
    df.sort_values(by='y', ascending=False, inplace=True)
    if len(df):
        return df['x1'].iloc[0], df['x2'].iloc[0]

func(data_x1, data_x2, data_y, -20, 20)
Output:
None

func(data_x1, data_x2, data_y, -30, 30)
Output:
(0.264284088, -27.55017459)

编辑:

使用 pandas DataFrame 很好,因为它将您的数据视为一个矩阵,您可以在其中根据多列中的值进行切片。下面的 numpy 解决方案有效,但需要用 np.nan 替换超出范围的值,以保持索引相同。

这是在 Removing nan in array at position from another numpy array 的帮助下的纯 numpy 解决方案

data_x1 = np.where(np.logical_and(data_x1 > -30, data_x1 < 30), data_x1, np.nan)
data_x2 = np.where(np.logical_and(data_x2 > -30, data_x2 < 30), data_x2, np.nan)
mask = ~np.isnan(data_x1) & ~np.isnan(data_x2)
data_y = np.where(mask, data_y, np.nan)
idx = np.nanargmax(data_y)

data_x1[idx], data_x2[idx]
Output:
(0.264284088, -27.55017459)

尽管如此,我同意 Evgeny 的观点并使用 Pandas DataFrame,因为遵循 IMO 更容易

关于python - 根据 Numpy 数组其他列中的约束查找列的 argmax(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59778655/

相关文章:

python - Scipy 稀疏三角矩阵?

javascript - 正常表单提交正确但ajax表单提交为空

python - 为什么这里的多处理速度较慢?

C++将字符串数组的元素存储到变量中

arrays - 按 Int 打乱结构

python - python中的用户输入

java - toArray 方法在扩展 ArrayList<> 的类中不起作用

python - 按顺序获取 NumPy 数据列的奇异值

python - 使用 Python 中另外两个数组设置的数组元素/数量创建新数组

python - 计算 ~1m Hermitian 矩阵的光谱范数 : `numpy.linalg.norm` is too slow