短版本:
是否有numpy(在python中)从两个间隔之间的float数组计算所有求和组合可能性的方法?
完整(长版):
借助Reddit的多个线程,我执行了此子集和程序以查找更接近的权重组合值。 (结果必须更高,但要尽可能接近,我需要查看所有组合)
def subset(array, num, epsilon):
result = []
def find(arr, num, path=()):
if not arr:
return
if (arr[0] >= num and arr[0] <= num + epsilon):
result.append(path + (arr[0],))
else:
find(arr[1:], num - arr[0], path + (arr[0],))
find(arr[1:], num, path)
find(array, num)
return result
def sumColumn(matrix):
return numpy.sum(matrix, axis=1) # axis=1 says "get the sum along the columns"
target = 7.00
suppaumaxde = 0.30
#data = [ 1.98, 1.93, 1.64, 2.06, 2.18, 2.12, 3.20, 1.29, 2*0.65, 1.84*2, 1.85*2]
#, 1.58*3, 1.46*3, (1.48*3+0.22), 1.12*4, 1.85*2, 2*1.84, 2*1.84, 1.18*3, 2.38+0.02, 0.65*5,
data = [ 1.13, 2.26, 3.93, 2.40-0.02, 2.38, 2.27, 1.98, 1.93, 1.64, 2.06, 2.18, 2.12, 3.20, 1.29, 2*0.65, 1.84*2,
1.85*2, 1.58*3, 1.46*3, (1.48*3+0.22), 1.12*4, 1.85*2, 2*1.84, 1.18*3, 2.38+0.02, 0.65*5,
3.23, 1.60, 0.58, 4.01, 1.09*3]
print data
Resultat=subset(data, target, suppaumaxde)
#print subset(data, target, suppaumaxde)
#print(' '.join(map(str, Resultat)))
#print([sum(row) for row in Resultat])
couleur='\33[37m'
print('\n')
for colonne in Resultat:
if (sum(colonne)<=target+(suppaumaxde*1/3)):couleur='\33[42m'
elif (sum(colonne)<=target+(suppaumaxde*2/3)):couleur='\33[43m'
elif (sum(colonne)<=target+(suppaumaxde*3/3)):couleur='\033[91m'
print couleur,sum(colonne),'\033[0m',(colonne)
data.sort(reverse=True)
print('\n')
print data
Resultat=subset(data, target, suppaumaxde)
#print(' '.join(map(str, Resultat)))
print('\n')
for colonne in Resultat:
if (sum(colonne)<=target+(suppaumaxde*1/3)):couleur='\33[42m'
elif (sum(colonne)<=target+(suppaumaxde*2/3)):couleur='\33[43m'
elif (sum(colonne)<=target+(suppaumaxde*3/3)):couleur='\033[91m'
print couleur,sum(colonne),'\033[0m',(colonne)
data.sort()
print('\n')
print data
Resultat=subset(data, target, suppaumaxde)
#print(' '.join(map(str, Resultat)))
print('\n')
for colonne in Resultat:
if (sum(colonne)<=target+(suppaumaxde*1/3)):couleur='\33[42m'
elif (sum(colonne)<=target+(suppaumaxde*2/3)):couleur='\33[43m'
elif (sum(colonne)<=target+(suppaumaxde*3/3)):couleur='\033[91m'
print couleur,sum(colonne),'\033[0m',(colonne)
它开始起作用,但我必须改进:
我只是开始使用python,所以我不了解整个程序,如果您愿意,我很乐意根据您的建议进行改进:)
我今天早上也在Reddit上发布了此内容,Laserdude10642谈论numpy, 因此,在启动RTFM之后,提高效率似乎是一个不错的选择,我通过查找其他示例进行了一些尝试:
import numpy as np
def find_nearest(array, value):
array = np.asarray(array)
idx = (np.abs(array - value)).argmin()
return array[idx]
montab = [ 2.95, 2.26, 3.93, 2.38*2, 1.98, 1.93, 1.64, 0.53, 1.20, 2.06, 2.18, 2.12, 3.20, 1.29, 1.20, 2*0.65, 1.84*2,
1.85*2, 1.58*3, 1.46*3, (1.48*3+0.22), 1.12*4, 1.18*3, 2.38+0.02, 0.65*5,
3.23, 1.60, 0.58, 4.01, 1.09*3, 0.60]
cible= 7
print(find_nearest(montab, cible))
但是我需要显示不对称间隔中的所有结果
用numpy是否有办法计算两个时间间隔之间所有可能的总和组合?
PS1:对不起,我的英语不好:/
PS2:理想情况下,我希望代码保持更容易理解,因此以后修改起来更容易
PS3:我在Geany(在Linux Mint上)中启动我的python程序,执行命令是“ python”%f“,是否有一种简单的方法可以在多个内核上使它吃得更快呢? -线程?)
PS4:无法通过“嗨”或“你好”开始提问吗?我都尝试过,但每次都消失了。
答案 0 :(得分:0)
基于此#n#
,我找到了其他解决方案,但仍然不是一个好的解决方案:
from numpy import *
from itertools import *
montab = [ 2.95, 2.26, 3.93, 2.38*2, 1.98, 1.93, 1.64, 0.53, 1.20, 2.06, 2.18, 2.12, 3.20, 1.29, 1.20, 2*0.65, 1.84*2,
1.85*2, 1.58*3, 1.46*3, (1.48*3+0.22), 1.12*4, 1.18*3, 2.38+0.02, 0.65*5,
3.23, 1.60, 0.58, 4.01, 1.09*3, 0.60, 0, 0]
target=7
suppaumaxde = 0.35
print montab
montab.sort(reverse=True)
print montab
couleur='\33[37m'
print('\n')
for colonne in combinations(montab,4):
if (sum(colonne)>=target and sum(colonne)<=target+suppaumaxde):
if (sum(colonne)<=target+(suppaumaxde*1/3)):couleur='\33[42m'
elif (sum(colonne)<=target+(suppaumaxde*2/3)):couleur='\33[43m'
elif (sum(colonne)<=target+(suppaumaxde*3/3)):couleur='\033[91m'
print couleur,sum(colonne),'\033[0m',(colonne)
但是结果不好,需要改进/找到其他解决方案: