函数,该函数应使用定义为输入列表的行/列之和生成矩阵

2024-10-01 17:37:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个任务,使函数从范围(0-8)内的非负整数生成矩阵

  • 函数的输入有两个列表:
    • sumForEveryCol公司
    • 苏门答腊
  • 每个列表包含每个行/列的值的总和
  • 示例:sumForEveryRow应该包含每一行的索引总和(sumForEveryRow[0]=第一行的总和。。。等等)
  • sumForEveryColumn[0]=第一列的总和。。sumForEveryColumn[1]-第二列。。等等)
  • 每行或每列之和为40的常量
  • 任何单元格的值都应在0到8之间

我有奇怪的想法(代码如下),但根本没有机会工作。。因为算法。。。生成这种矩阵的一般算法是什么?用python实现它的最佳方法是什么

示例:

sumsForEveryRow = [4,20,8,8] = constant 40
sumsForEveryCol = [8,8,8,8,8] = constant 40

gen_matrix(sumForEveryRow, sumForEveryCol) should produce random matrix like:

[ 0 , 2 , 0 , 0 , 2 ],  - sum of row 1 should be 4
[ 1 , 2 , 8 , 5 , 4 ],  - sum of row 2 should be 20
[ 3 , 2 , 0 , 3 , 0 ],  - sum of row 3 should be 8
[ 4 , 2 , 0 , 0 , 2 ],  - sum of row 4 should be 8
sum for every column should be
  8   8   8   8   8



import random
import numpy

sumsForEveryCol = [8,8,8,8,8]
sumsForEveryRow = [4,20,8,8]
def gen_matrix(sumForEveryCol, sumForEveryRow):
    sum = 40
    max_value_cell = 8
    num_of_rows = len(sumsForEveryRow)
    num_of_cols = len(sumsForEveryCol)
    matrix = numpy.zeros((num_of_rows, num_of_cols), dtype=numpy.int)

    for i in range(0, num_of_rows - 1):
        cur_row_sum = sumsForEveryRow[i]
        for j in range(0, num_of_cols - 1):
            if max_value_cell >= cur_row_sum:
                if cur_row_sum == 0:
                    matrix[i][j] = 0
                else:
                    # Dont generate 0 values ????
                    rand_digit = random.randint(1, cur_row_sum)
                    cur_row_sum = cur_row_sum - rand_digit
                    matrix[i][j] = rand_digit
            else:
                rand_digit = random.randint(0, max_value_cell)
                matrix[i][j] = rand_digit
                cur_row_sum = cur_row_sum - rand_digit


    return matrix

Tags: ofrandombematrixnumrowsumdigit

热门问题