Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于Numpy数组的其他列中的约束查找列的argmax()_Python_Arrays_Numpy - Fatal编程技术网

Python 基于Numpy数组的其他列中的约束查找列的argmax()

Python 基于Numpy数组的其他列中的约束查找列的argmax(),python,arrays,numpy,Python,Arrays,Numpy,我的问题很简单,可能有一个非常简单的方法来解决这个问题,但我找不到。因此,首先,我连接一些数组,然后我想找到第一列和第二列(data_x1,data_x2)的组合,它返回y的最大值。但是,有一个约束,我想把所有的x限制在-20和20之间,如果它大于20或小于-20,我想忽略这个值 此外,我在函数中使用这个过程,因此我真的在寻找一种方法,它可能适用于n个“x”。总结:我想找出受约束数据_x1和数据_x2的最佳y,也就是说,行数据_y中的最佳值,对应于受上述条件限制的数据_x1和数据_x2的值(-2

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

此外,我在函数中使用这个过程,因此我真的在寻找一种方法,它可能适用于n个“x”。总结:我想找出受约束数据_x1和数据_x2的最佳y,也就是说,行数据_y中的最佳值,对应于受上述条件限制的数据_x1和数据_x2的值(<20和>-20)。例如,在我提供的这个数据集中,包含最大数据_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])


希望我能简明扼要,尽管解释的篇幅很长。我非常感谢你在这件事上的帮助

您的数据_x2不包含介于-20和20之间的值

如果可以使用pandas,则可以这样做(例如-30 这是一个计算这个的函数。(再次使用熊猫)

编辑:

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

这里有一个纯numpy的解决方案,由

data\u-x1=np.where(np.logical\u和(data\u-x1>-30,data\u-x1<30),data\u-x1,np.nan)
data_x2=np.where(np.logical_和(data_x2>-30,data_x2<30),data_x2,np.nan)
掩码=~np.isnan(数据_x1)和~np.isnan(数据_x2)
data_y=np.where(掩码,data_y,np.nan)
idx=np.nanargmax(数据y)
数据_x1[idx],数据_x2[idx]
输出:
(0.264284088, -27.55017459)
尽管如此,我还是同意Evgeny的观点,并使用熊猫数据帧,因为它更容易遵循IMO

首先,我连接一些数组

三个向量

然后我想找到第一列和第二列(data_x1,data_x2)的组合,它返回y的最大值

就一排

但是,有一个约束,我想把所有的x限制在-20和20之间,如果它大于20或小于-20,我想忽略这个值

见上面的问题

是什么阻止您按x1和x2上的条件过滤数据帧并在之后查找y最大位置

我建议将numpy向量包装在一个数据框架中,以便更轻松地处理它们

这里描述了数据帧上的Argmax

在找到y之前,您可能需要消除不满意的x。如果需要多个y,则按y排序

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
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)
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)