2017-07-25 71 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。你可能會適應你的目的,但我不夠好用遞歸邏輯創建一個有效的生成器。