【发布时间】:2022-01-04 13:34:45
【问题描述】:
我需要找到最佳方法来生成一个数组,该数组包含值 0 到 1.0 的所有可能组合,增量为 0.1,其中每个组合的总和正好等于 1。
我已使用以下代码对长度为 3 的数组执行此操作:
portfolios = []
for i in np.arange(0,1.1,0.1):
for j in np.arange(0,1-i,0.1):
k = 1 - i - j
x = [i,j,k]
portfolios.append(x)
portfolios = np.array(portfolios)
这给了我以下内容
print(portfolios)
#Output:
array([[0. , 0. , 1. ],
[0. , 0.1, 0.9],
[0. , 0.2, 0.8],
[0. , 0.3, 0.7],
[0. , 0.4, 0.6],
[0. , 0.5, 0.5],
[0. , 0.6, 0.4],
[0. , 0.7, 0.3],
[0. , 0.8, 0.2],
[0. , 0.9, 0.1],
[0.1, 0. , 0.9],
[0.1, 0.1, 0.8],
[0.1, 0.2, 0.7],
[0.1, 0.3, 0.6],
[0.1, 0.4, 0.5],
[0.1, 0.5, 0.4],
[0.1, 0.6, 0.3],
[0.1, 0.7, 0.2],
[0.1, 0.8, 0.1],
[0.2, 0. , 0.8],
[0.2, 0.1, 0.7],
[0.2, 0.2, 0.6],
[0.2, 0.3, 0.5],
[0.2, 0.4, 0.4],
[0.2, 0.5, 0.3],
...
[0.7, 0. , 0.3],
[0.7, 0.1, 0.2],
[0.7, 0.2, 0.1],
[0.8, 0. , 0.2],
[0.8, 0.1, 0.1],
[0.9, 0. , 0.1]])
但是,我想对长度为 7 的数组执行此操作。也就是说,我想要的输出应该如下所示:
#Desired output
array([[0. , 0., 0., 0., 0., 0., 1.],
[0. , 0., 0., 0., 0., 0.1, 0.9],
[0. , 0., 0., 0., 0., 0.2, 0.8],
...
[0.2, 0.8, 0., 0., 0., 0., 0.],
[0.1, 0.9, 0., 0., 0., 0., 0.],
[.1, 0., 0., 0., 0., 0., 0.]])
有没有一种聪明的方法来扩展我以前的代码?接受所有建议和替代方法。
【问题讨论】:
-
顺序重要吗?即只要您拥有所有独特的组合就可以了吗?另外,在一定长度的数组之后,您不只是添加更多的零吗?例如,在长度为 5 的数组(.1+.2+.3+.4+.5>1,5 个最小正增量)之后,没有 .1 增量的总和小于 1,所以没有新的组合?
-
@RichardKYu 订单很重要。例如:在长度为 3 的情况下,数字为 0.7、0.3 和 0.0,我想生成所有组合:[0.7,0.3,0.0],[0.7,0.0,0.3],[0.3,0.7,0.0][0.3, 0.0,0.7],[0.0,0.3,0.7],[0.0,0.7,0.3]。但是,这些组合的顺序无关紧要。此外,长度为 7 的数组可能看起来像:[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.4],这意味着数字可以重复。
标签: python arrays list-comprehension