Как создать подобную матрицу?

  1. Рандомно генерируется 3 числа: m, n, q.
  2. Генерируется список рандомных значений длиной n
  3. Генерируется матрица, в которой первая строка - сгененированный во втором пункте список, а элементы всех последующих строк равны вертикально верхнему элементу, умноженному на число q. То есть наш список является набором первых элементов столбцов, причем каждый стобец - идущая вертикально вниз геометрическая прогрессия. Мой способ:
import random
m = random.randint(3,7)
n = random.randint(3,7)
q = random.randint(3,7)
matrix = [[random.randint(0, 5) for i in range(n)] for j in range(m)]
spis = [random.randint(0,10) for x in range(n)]
print(str(spis))
print(f'      *{q}       ')
matrix[0] = spis
for i in range(len(matrix)):
    for j in range(len((matrix[i]))):
        if i == 1:
            continue
        elif i > 1:
            matrix[i][j] = matrix[i-1][j] * q
for r in range(len(matrix)):
    print(matrix[r])

У меня выводится какая-то вакханалия. Помогите пожалуйста


Ответы (3 шт):

Автор решения: MBo
row = [random.randint(0, 10) for i in range(n)]
matrix = [[row[i]*q**j for i in range(n)] for j in range(m)]
→ Ссылка
Автор решения: Сергейко

Спасибо, если кто-то начал разбираться, но я уже все сделал сам

import random
m = random.randint(3,7)
n = random.randint(3,7)
q = random.randint(3,7)
matrix = [[random.randint(0, 5) for i in range(n)] for j in range(m)]
spis = [random.randint(0,10) for x in range(n)]
print(str(spis))
print(f'      *{q}       ')
matrix[0] = spis
for i in range(len(matrix)):
    for j in range(len((matrix[i]))):
        matrix[1][j] = matrix[0][j] * q
        if i == 1:
            continue
            matrix[1][j] = matrix[0][j] * q
        elif i > 1:
            matrix[i][j] = matrix[i-1][j] * q
for r in range(len(matrix)):
    print(matrix[r])
→ Ссылка
Автор решения: Алексей Р

То же через numpy

import numpy as np

m, n, q = np.random.randint(3, 7, 3)
a = np.append(np.random.randint(0, 10, n), np.full(n * (m - 1), q)).reshape(m, -1).cumprod(axis=0)  # чтобы преобразовать в список, нужно добавить .tolist()
print(a)
[[  4   6   8   2   0   9]
 [ 16  24  32   8   0  36]
 [ 64  96 128  32   0 144]
 [256 384 512 128   0 576]]
→ Ссылка