我试图在6参数函数的参数空间上运行以研究它的数值行为,然后再尝试做任何复杂的事情,所以我正在寻找一种有效的方法来做到这一点.
给定6-dim numpy数组作为输入,我的函数采用浮点值.我最初尝试做的是:
首先,我创建了一个函数,它接受2个数组并生成一个数组,其中包含来自两个数组的所有值组合
from numpy import *
def comb(a,b):
c = []
for i in a:
for j in b:
c.append(r_[i,j])
return c
Run Code Online (Sandbox Code Playgroud)
然后我习惯reduce()将它应用于相同数组的m个副本:
def combs(a,m):
return reduce(comb,[a]*m)
Run Code Online (Sandbox Code Playgroud)
然后我评估我的功能如下:
values = combs(np.arange(0,1,0.1),6)
for val in values:
print F(val)
Run Code Online (Sandbox Code Playgroud)
这有效,但它太慢了.我知道参数的空间很大,但这不应该太慢.在这个例子中我只抽取了10 6(一百万)个点,并且创建数组花了超过15秒values.
你知道用numpy做这个更有效的方法吗?
F如果有必要,我可以修改函数获取它的参数的方式.
我似乎尽管有大量的算法和函数用于从唯一项目列表中生成任何大小的唯一组合,但是在非唯一项目列表(即包含重复项的列表)中没有可用的相同的价值.)
问题是如何在生成器函数中生成ON-THE-FLY所有来自非唯一列表的独特组合,而不需要过滤重复计算的昂贵计算?
现在,由于对这个问题有一个很有动力的答案,因此更容易提供我期望实现的目标:
首先,让我们提供一些代码,说明如何检查组合comboB是否与另一个组合重复(comboA):
comboA = [1,2,2]
comboB = [2,1,2]
print("B is a duplicate of A:", comboA.sort()==comboB.sort())
Run Code Online (Sandbox Code Playgroud)
在给定的例子中,B是A的副本,print()打印为True.
在这里解决了获取能够在非唯一列表的情况下即时提供独特组合的生成器功能的问题:从非唯一项目列表中获取独特的组合,更快?,但是提供的生成器函数需要查找并且需要内存,以便在大量组合的情况下导致问题.
在当前版本的答案提供功能完成工作没有任何查找,似乎是正确的答案,但......
摆脱查找的目的是在列表重复的情况下加速生成唯一组合.
我最初(编写这个问题的第一个版本)错误地认为,不需要创建用于确保唯一性所需的查找集的代码预期会比需要查找的代码具有优势.事实并非如此.至少并非总是如此.截至目前提供的答案中的代码不使用查找,但是如果没有冗余列表或者列表中只有少量冗余项,则需要花费更多时间来生成所有组合.
这里有一些时间来说明目前的情况:
-----------------
k: 6 len(ls): 48
Combos Used Code Time
---------------------------------------------------------
12271512 len(list(combinations(ls,k))) : 2.036 seconds
12271512 len(list(subbags(ls,k))) : 50.540 seconds
12271512 len(list(uniqueCombinations(ls,k))) : 8.174 seconds
12271512 len(set(combinations(sorted(ls),k))): 7.233 seconds
---------------------------------------------------------
12271512 len(list(combinations(ls,k))) : 2.030 seconds
1 len(list(subbags(ls,k))) : 0.001 seconds
1 len(list(uniqueCombinations(ls,k))) : 3.619 seconds …Run Code Online (Sandbox Code Playgroud)