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,创建这样的阵列既缓慢又困难。
答案 0 :(得分:1)
使用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
但它仍然会很慢。你for
很多(与c
循环基本相同的构造函数,但在n < sum
完成,所以仍然快得多)
您正在做的事情被称为partitioning,efficient algorithms有generators个整数,但它们通常涵盖String s = "arg1: val1 arg2: val2 arg3: va:l3";
Map<String, String> map = new LinkedHashMap<String, String>();
String[] splitted = s.split("arg\\d*:");
for (int i = 1; i < splitted.length; i++) {
map.put(String.valueOf("arg" + (i)), splitted[i].trim());
}
System.out.println(map);
所有的n维空间。你可以根据自己的目的调整一个,但是我在递归逻辑方面做得不够好,无法创建有效的生成器。
答案 1 :(得分: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
的{{1}}元素列表,其总和为dp
。
我让你调整这个函数来返回你正在寻找的所有可能的数组(主要是你必须用sum
的随机生成替换0.001之间的循环(精度为val
)和dp
。