我正在使用Ising model
做一些工作。我编写了一个代码来帮助我计算一个格子的多重性,但是如果没有得到MemoryError,我就无法达到任何大数。
基本的想法是,你有一个零和一个列表,比如说[0,0,1,1]
。我想生成一组所有可能的1和0的排序。所以在这个例子中我想要一个这样的集合:
[(1,1,0,0),(1,0,1,0),(1,0,0,1),(0,1,1,0),(0,1,0,1),(0,0,1,1)]
目前我这样做了:
set_initial=[0,0,1,1]
set_intermediate=[]
for subset in itertools.permutations(set_initial,4):
set_intermediate.append(subset)
set_final=list(set(set_intermediate))
问题在于,在set_intermediate中,对于此示例,有2^4
个元素,其中只有six
个唯一的元素。另外举例如[0,0,0,0,0,0,0,0,1]
,有2^9
个元素,只有9
个唯一。
是否有另一种方法可以使set_intermediate成为瓶颈?
答案 0 :(得分:2)
您可以考虑选择1的位置作为组合,而不是排列。 (我知道我做过类似的事情before ..)
>>> list(binary_perm([0,0,1,1]))
[[1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1], [0, 1, 1, 0], [0, 1, 0, 1], [0, 0, 1, 1]]
>>> %timeit sum(1 for x in binary_perm([1]+[0]*10**4))
1 loops, best of 3: 409 ms per loop
不是超级快,但产生的输出数量恰到好处,因此可以处理更长的序列:
switchToLatest
当然,通常你首先要避免循环使用这些,但是根据你对permeations的处理方式,你可能无法直接计算出独特排列的数量。
答案 1 :(得分:1)
尝试使用内置方法 itertools.permutation(iterable,r)