【问题标题】:Generating array with N columns, with row sum equal to one生成具有 N 列的数组,行和等于 1
【发布时间】:2026-02-08 16:05:02
【问题描述】:

我想创建一个包含 N 列的矩阵(权重),其中行和应该等于 1。 也以间隔作为参数。 而且我必须找到所有可能的值集。

例如,如果 N = 3

interval = 0.01
weights = []
for i in np.arange(0,1.01,interval):
    for j in np.arange(0,1.01,interval):
        if i + j <= 1:
            weights.append(np.array([i,j,1-(i+j)]))

如果 N = 4

interval = 0.1
weights_4 = []
for i in np.arange(0,1.1,interval):
    for j in np.arange(0,1.1,interval):
        for k in np.arange(0,1.1,interval):
            if i + j + k <= 0:
                weights_4.append(np.array([i,j,k,1-(i+j+k)]))

有没有什么方法可以使它与 N 一起动态化,并且以一种有效的方式? 提前谢谢你。

【问题讨论】:

  • 如果考虑小数点,这样的组合将无限多。 @Akileshvar
  • 间隔是另一个参数? @Vishnudev
  • 间隔是什么意思。请明确说明输入和预期输出。
  • 由于问题的构造方式,您的时间复杂度总是 O(n!) 其中n 是您的列数。由于使用append 方法而不是列表理解,您的 python 代码当然会慢得多。
  • @Vishnudev 请再次检查问题,我已更新。间隔是指小数点。

标签: python arrays numpy loops matrix


【解决方案1】:
import numpy as np
interval = 0.1
weights = []

code=""
N=6
for line in range(N+1):
 if line<N:   
  code=code+" "*line+"for i"+str(line)+" in np.arange(0,1.1,"+str(interval)+"):"+"\n"
 else:
  somme=   ["i"+str(el)for el in range(N)]
  code=code+" "*line+"if "+ "+".join(somme)+"<= 0:"+"\n"
  code=code+" "*(line+1)+"weights.append(np.array(["+ ",".join(somme)+",1-("+"+".join(somme)+")]))"
print(code)
exec(code)
print(weights)
    

【讨论】:

  • 嘿,@Bahae El Hmimdi,我刚刚运行了你的代码,它只生成了一个数组,我浏览了代码,并将 if condition 更改为 code=code+" "*line+"if "+ "+".join(somme)+"&lt;= 1:"+"\n" ,然后它运行良好.我不知道这是否是有效的方法,但它确实有效。非常感谢。
最近更新 更多