从10中选取三个随机数并使x ** 2 + x * y-y ** 2 + z最小

时间:2018-05-16 11:35:19

标签: python python-3.x

假设我得到L=[1, 1, 1, 3, 1, 1, 1, 1, 1, 1] 然后func(L)应该返回-4,因为min(x^2+x*y-y^2+z)=-4x中的yzL

在没有三个func循环的情况下构建for的更好方法是什么?

1 个答案:

答案 0 :(得分:0)

我们将计算L的所有unqiue排列,以摆脱重复的计算。然后在所有排列上执行您的功能,找到最小值。

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 over result:

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