首页 > 解决方案 > 从十个中选择三个随机数并使 x**2+x*yy**2+z 最小

问题描述

假设我得到L=[1, 1, 1, 3, 1, 1, 1, 1, 1, 1] thenfunc(L)应该返回-4, 因为 min(x^2+x*y-y^2+z)=-4, 对于任何x, y, zin L

func没有三个for循环的更好的构建方法?

标签: pythonpython-3.x

解决方案


我们将计算所有的 unqiue 排列L以消除重复计算。然后对所有排列执行你的函数,找到最小值。

从中检索一个唯一集合L并将所有排列放入一个列表中:

import numpy as np
import itertools

L = [1, 1, 1, 3, 1, 1, 1, 1, 1, 1]
np_array = np.unique(L)

当唯一值的数量不是至少三个时进行调整:

int_len = 3 - len(np_array)
if int_len > 0:
    np_array = np.pad(np_array, (int_len,0), 'edge')

li = np_array.tolist()

查找所有长度的组合3

perms = list(itertools.combinations_with_replacement(li, 3))

将三个数组列重新分配给它们对应的变量:

a = np.array(perms)
x = a[:,0]
y = a[:,1]
z = a[:,2]

计算数组中每个排列的函数并对结果执行 min:

minimum_value = np.min(np.square(x) + np.multiply(x,y) - np.square(y) + z)

推荐阅读