我对python / numpy很新。我想将值存储在numpy数组中,这是一个简单组合问题的解决方案。 在这里,我有两个给定值x和y以及一个x< = bound和y< = bound的边界。我需要找到满足 x + b y< =与" a"和" b"都是正整数。因此,我通过迭代所有可行的输入来实现这一目标" a"和" b"并使用解决方案扩展我的数组。
问题是,我只需要出现一次解决方案。就像我下面的代码示例中一样,对于x = 3,y = 5和bound = 20,解15将是(a,b)=(5,0)的* 3 + b * 5的结果,也是(A,b)=(0,3)。我不需要冗余。我想到的最好方法是检查if-block,如果计算的解决方案尚未存储,只有这样,该值才会添加到我的数组中。
除了在每个迭代步骤中检查整个现有数组之外,还有更有效的方法吗?像np.append以外的函数一样,它只自动存储值,但是还不存在? 或者有没有办法首先存储所有计算的解决方案,但然后只返回一个没有冗余值的数组? (那会有效吗?)
PS:我正在使用非常大的边界,我的数组需要存储几千个值。
import numpy as np
x=3
y=5
bound=20
arr=([]) # empty array at first
for a in range(np.int(bound/x)+1):
for b in range(np.int((bound-a*x)/y)+1):
feasible_combination=a*x+b*y
if feasible_combination not in arr[:]: # no need for redundance
arr=np.append(arr,feasible_combination)
arr=np.sort(arr)
print(arr)
答案 0 :(得分:0)
这里有两个更快的版本,一个使用set
,另一个使用NumPy中的几乎所有工作:
def combinations_set(x, y, bound):
combs = set()
for a in range(np.int(bound/x)+1):
for b in range(np.int((bound-a*x)/y)+1):
combs.add(a*x+b*y)
return np.sort(list(combs))
def combinations_ix(x, y, bound):
a, b = np.ix_(*[np.arange(int(bound/_)+1) for _ in (x, y)])
combs = a*x + b*y
return np.sort(np.unique(combs[combs <= bound]))
对于以下示例,与原始代码相比,combinations_ix
在我的机器上提供了1607倍的加速,但combinations_set
相当具有竞争力(并且应该使用比combinations_ix
更少的内存) :
In [58]: %timeit combinations(200, 234, 100000) # original code as function
1 loops, best of 3: 8.23 s per loop
In [59]: %timeit combinations_set(200, 234, 100000)
100 loops, best of 3: 16.1 ms per loop
In [60]: %timeit combinations_ix(200, 234, 100000)
100 loops, best of 3: 5.12 ms per loop