2017-07-25 99 views
0
Write Function to Generate N-array with some decimal place 

>>> func(2,3) # 2d-array with 3 dp, sum those value to 1 
[0.001],[0.999] 
... 
[0.999],[0.001] 
>>> func(3,3) 
[0.001],[0.001],[0.998] 
.... 
[0.998],[0.001],[0.001] 

我可以在使用嵌套的for循环时创建这些数组。 当n> 4时,创建这样的数组很慢且很难。N维阵列创建

+0

你可能会更好地使用'itertools'创建构造函数,因为任何大于'n + d> 6'的东西都会冒内存问题。 –

+0

我的目标与视频相似 https://www.youtube.com/watch?v=HdBX-Hn2uYo&feature=youtu.be 如何将N个硬币拆分为r人 – hks014

回答

0

提示

我会尝试使用递归函数

def auxiliary_function(dim, dp, sum): 
    if sum < 0: 
     raise Exception("error") 
    if dim == 1: 
     return [sum] 
    val = random.random(1, sum * 10 ** dp - 1)/10 ** dp 
    aux_list = auxiliary_function(dim - 1, dp, sum - val) 
    aux_list.append(val) 
    return aux_list 

,然后我会打电话auxiliary_function(dim, dp, 1)

这个辅助递归函数的目标是返回一个dim元素的列表,其精度为dp,其总和为sum

我让你适应这个函数返回你正在寻找可能的阵列(主要是你通过一个循环来代替0.001之间随机生成的val(与dp精度)和sum

1

随着itertools你可以做这样的事情:

import itertools as it 
import numpy as np 

def sum_generator(dim, dp, sum): 
    i = np.linspace(0,1,10^dp)[1:-1].flat 
    return it.ifilter(lambda x: np.sum(x)==sum, it.product(*(i,)*dim)) 

但它仍然会很慢你ifilter -ing很多(本质上是相同的构造为for循环,但在c这样做性病。 LL更快)

你在做什么叫做partitioning也有一些efficient algorithms对此种generators为整数,但它们通常覆盖所有n维空间,其中n < sum。你可能会适应你的目的,但我不够好用递归逻辑创建一个有效的生成器。