функция, которая должна генерировать матрицу с суммами строк / столбцов, определенных как входные списки - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть задача создать функцию, которая генерирует матрицу из неотрицательных целых чисел в диапазоне (0-8)

  • Ввод функции осуществляется в 2 списка:
    • sumForEveryCol
    • sumForEveryRow
  • Каждый список содержит сумму значений для каждой строки / столбца
  • Пример: 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
...