Python 对行和列进行规格化

Python 对行和列进行规格化,python,arrays,Python,Arrays,我有一系列的可能性。我希望列和为1(表示概率),行和为X(其中X是整数,例如9) 我认为我可以规范化列,然后通过X规范化行和时间。但这不起作用,行和列的结果之和不是完美的1.0和X 这就是我所尝试的: # B is 5 rows by 30 columns # Normalizing columns to 1.0 col_sum = [] for col in B.T: col_sum.append(sum(col)) for row in range(B.shape[0]):

我有一系列的可能性。我希望列和为1(表示概率),行和为X(其中X是整数,例如9)

我认为我可以规范化列,然后通过X规范化行和时间。但这不起作用,行和列的结果之和不是完美的1.0和X

这就是我所尝试的:

# B is 5 rows by 30 columns

# Normalizing columns to 1.0
col_sum = []
for col in B.T:
    col_sum.append(sum(col))

for row in range(B.shape[0]): 
    for col in range(B.shape[1]):
        if B[row][col] != 0.0 and B[row][col] != 1.0:
            B[row][col] = (B[row][col] / col_sum[col])

# Normalizing rows to X (9.0)
row_sum = []
for row in B:
    row_sum.append(sum(row))

for row in range(B.shape[0]): 
    for col in range(B.shape[1]):
        if B[row][col] != 0.0 and B[row][col] != 1.0:
            B[row][col] = (B[row][col] / row_sum[row]) * 9.0

我不确定我是否理解正确,但似乎你试图实现的目标在数学上不可行


假设您有一个2x2矩阵,其中希望行和为1,列和为10。即使将列1中的所有数字(它们的最大可能值)相加,也无法将列中的数字相加为10?

只有当矩阵的列数是行数的X倍时,这才有效。例如,如果X=3且有5行,则必须有15列。因此,您可以使5x30矩阵适用于X=6,但不适用于X=9

原因是,如果每列总和为1.0,则矩阵中所有值的总和将是列数的1.0倍。由于您希望每行的总和为X,那么所有值的总和也必须是行数的X倍

所以:列*1.0=X*行

如果满足该约束,则只需按X/sum(行)的比例调整所有值,除非初始值未正确平衡,否则两个尺寸标注将自动工作。如果矩阵尚未平衡,调整值将类似于解决数独问题(据称是NP问题),结果在很大程度上与初始值无关。当调整为具有相同总和的所有行导致所有列具有相同总和时,矩阵是平衡的

[0.7, 2.1, 1.4, 0.7, 1.4, 1.4, 0.7, 1.4, 1.4, 2.1, 0.7, 2.1, 1.4, 2.1, 1.4] 21
[2.8, 1.4, 0.7, 2.1, 1.4, 2.1, 0.7, 1.4, 2.1, 1.4, 0.7, 0.7, 1.4, 0.7, 1.4] 21
[1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 1.4, 0.7, 2.8, 0.7, 0.7, 1.4, 2.1] 21
[1.4, 1.4, 1.4, 1.4, 2.1, 1.4, 1.4, 1.4, 0.7, 0.7, 2.1, 1.4, 1.4, 1.4, 1.4] 21
[0.7, 0.7, 2.1, 1.4, 0.7, 0.7, 2.8, 1.4, 1.4, 2.1, 0.7, 2.1, 2.1, 1.4, 0.7] 21
将x=x*3/21应用于所有元素

[0.1, 0.3, 0.2, 0.1, 0.2, 0.2, 0.1, 0.2, 0.2, 0.3, 0.1, 0.3, 0.2, 0.3, 0.2] 3.0
[0.4, 0.2, 0.1, 0.3, 0.2, 0.3, 0.1, 0.2, 0.3, 0.2, 0.1, 0.1, 0.2, 0.1, 0.2] 3.0
[0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.1, 0.4, 0.1, 0.1, 0.2, 0.3] 3.0
[0.2, 0.2, 0.2, 0.2, 0.3, 0.2, 0.2, 0.2, 0.1, 0.1, 0.3, 0.2, 0.2, 0.2, 0.2] 3.0
[0.1, 0.1, 0.3, 0.2, 0.1, 0.1, 0.4, 0.2, 0.2, 0.3, 0.1, 0.3, 0.3, 0.2, 0.1] 3.0

[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]