【发布时间】:2018-09-06 16:40:18
【问题描述】:
短版:
有没有办法使用 numpy(在 python 中)从两个区间之间的浮点数组计算所有和组合的可能性?
完整(长)版本:
在 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)
它开始起作用了,但我必须改进:
- 如果我对数组进行不同的排序,我会得到不同的结果。所以我认为缺少一些结果。 (这就是为什么我重复显示代码 3 次而不做一个函数来显示这个。但我想删除最后两个)
- 由于我在数组中添加了更多输入,因此执行时间变长了。也许这没有优化并且做了太多的操作。也许在比较之前订购,一旦达到极限值就传递给下一个项目?
- 理想情况下,我喜欢对结果进行排序,但不会增加太多执行时间。
- 某些结果出现多次(作为第二点,我认为缺少一些优化)
我刚开始使用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 中启动我的 python 程序(在 Linux Mint 上),执行命令是“python”%f”,有没有一种简单的方法可以在多个内核上午餐以更快地运行?(没有调整程序的多核-线程?)
PS4:不能以“Hi”或“Hello”开始提问吗?我都试过了,但每次都消失了。
【问题讨论】:
-
这太宽泛了。你问的具体是什么?
-
抱歉:/ 很短:有没有办法用 numpy(在 python 中)从两个区间之间的浮点数组中计算所有总和组合的可能性?
标签: python-2.7 numpy sum subset