如何对每一列中的所有值求和,并将每一列除以总和?

4

我有一个名为M10000x10000矩阵,每列都有10。我试图计算每一列中1的数量,然后将该列中的每个元素除以此数字。

这是我的尝试:

outbound_links = M[M == 1].count()

mat = [[1] * 10000] * 10000
n = 10000
#len(mat)

# for each column
for col_index in range(0, n):

    # count the number of 1s
    for row_index in range(0, n):
      
      if M[row_index][col_index] == 1:
            mat[row_index][col_index] = 1 / outbound_links[col_index]
    else:
            mat[row_index][col_index] = 0

print(mat)

但是代码无法运行,因为矩阵似乎太大了。我想知道还有哪些其他的选择?


4
建议使用NumPy完成此操作。将矩阵转换为NumPy数组,然后使用现有的“sum”方法。 - Andrew
请注意,mat = [[1] * 10000] * 10000 将创建一个包含对同一列表的10k个引用的“矩阵”。您必须使用[[1] * 10000 for _ in range(10000)],或者更好地使用numpy - tobias_k
另外,请记住,一个10000x10000的位值矩阵可能比一个10000x10000的浮点数矩阵存储得更有效率,因此也许你应该将它们保留为1/0并单独存储总和,在真正需要时才分别除以各行。 - tobias_k
3个回答

2

如评论中所建议,您应该使用numpy来完成此任务。我认为以下代码可以实现:

import numpy as np

m = np.random.randint(0, 2, (4, 4))

# array([[0, 1, 1, 0],
#        [0, 1, 0, 1],
#        [0, 1, 0, 1],
#        [1, 1, 1, 0]])

m / np.sum(m, axis=0)[np.newaxis, :]

# array([[0.  , 0.25, 0.5 , 0.  ],
#        [0.  , 0.25, 0.  , 0.5 ],
#        [0.  , 0.25, 0.  , 0.5 ],
#        [1.  , 0.25, 0.5 , 0.  ]])

哇,这真的很高效!但是如何处理那些加起来为0的列呢? - Jayne How
@JayneHow 这可以很容易地通过使用 np.errstatenp.nan_to_num 来处理。 - Péter Leéh

0

没有 numpy 的方法。只需迭代所有列,对于每个列找到其中的1的数量,然后将每个单元格除以该计数:

from random import randint

n = 4
mat = [[randint(0,1) for _ in range(n)] for _ in range(n)]

print(*mat, sep='\n')

for col in range(n):
    # count the number of 1s
    ones = sum(mat[row][col] for row in range(n))

    if ones:  # Avoid dividing by zero
        for row in range(n):
            mat[row][col] /= ones

print('\n', *mat, sep='\n')

一个示例运行:

[1, 0, 0, 1]
[0, 1, 1, 0]
[0, 0, 0, 1]
[1, 1, 1, 1]


[0.5, 0.0, 0.0, 0.33]
[0.0, 0.5, 0.5, 0.0]
[0.0, 0.0, 0.0, 0.33]
[0.5, 0.5, 0.5, 0.33]

-1
你可以尝试这个:
import numpy as np

mat = np.array(M)
for i in range(len(mat[0])):
    try:
        mat[:,i] = mat[i,:]/np.sum(mat[:,i])
    except:
        print("no ones in that column")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接