Помогите исправить код по целочисленной квадратной матрице

import numpy as np
n=int(input("Введите размер матрицы (NxN): "))

A = 20*np.random.random(size=(n,n)) - 10
for Row in range(n):
    for Col in range(n):
        print("{0:>5.0f}".format(A[Row][Col]), end=" ")
    print()
print()
 

summ = 0
isNeg = False

for i in range(n):
    for j in range(n):
        if A[i][j] < 0:
            isNeg = True
            continue
        summ += A[i][j]
    if isNeg == False:
        print("Сумма элементов в столбце без отрицательного элемента: ", summ)
    sum = 0
    isNeg = False
    

countDiagonal = 2 * n - 1
sumArray = 0
minSum = A[0][n-1]
for i in range(countDiagonal):
    t = n - i - 1
    row = -t if t < 0 else 0
    col = t if t > 0 else 0
    while row < n and col < n:
        sumArray += A[row][col]
        row += 1
        col += 1
    if minSum > sumArray:
        minSum = sumArray
    sumArray = 0

print("Минимум, среди сумм диагоналей паралельных побочной: ", minSum)

У меня такое задание: Дана целочисленная квадратная матрица. Определить:

  1. Сумму элементов в тех столбцах, которые не содержат отрицательных элементов.
  2. Минимум среди сумм модулей элементов диагоналей, параллельных побочной диагонали матрицы

Появилось такая проблема, я не могу понять почему у меня ищется не по столбцам, а по строкам. А также почему то минимум во втором задание ищет по диагоналям параллельных главной, а не побочной.


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

Автор решения: MaxU

почему бы вам не использовать numpy как модуль для работы с матрицами, а не как генератор случайных чисел?

In [132]: n = 5

In [133]: np.random.seed(42)

In [134]: A = np.random.randint(-4, 20, size=(n,n))

In [135]: A
Out[135]:
array([[ 2, 15, 10,  6,  3],
       [16,  2, 14, 18,  6],
       [ 6, 19, 16, -1,  3],
       [19, -2, 17, 16, -3],
       [19,  7,  1, -3, 16]])

решение:

In [136]: ans1 = A[:, (A>=0).all(axis=0)].sum()

In [137]: ans2 = min([np.fliplr(A).diagonal(i).sum() for i in range(-(n-1), n)])

результат:

In [138]: ans1
Out[138]: 120

In [139]: ans2
Out[139]: -6

пошагово (вопрос 1):

In [142]: (A>=0)
Out[142]:
array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True, False,  True],
       [ True, False,  True,  True, False],
       [ True,  True,  True, False,  True]])

In [143]: (A>=0).all(axis=0)
Out[143]: array([ True, False,  True, False, False])

In [144]: A[:, (A>=0).all(axis=0)]
Out[144]:
array([[ 2, 10],
       [16, 14],
       [ 6, 16],
       [19, 17],
       [19,  1]])

In [145]: A[:, (A>=0).all(axis=0)].sum()
Out[145]: 120

пошагово (вопрос 2):

In [146]: [np.fliplr(A).diagonal(i).tolist() for i in range(-(n-1), n)]
Out[146]:
[[16],
 [-3, -3],
 [3, 16, 1],
 [6, -1, 17, 7],
 [3, 18, 16, -2, 19],
 [6, 14, 19, 19],
 [10, 2, 6],
 [15, 16],
 [2]]

In [147]: [np.fliplr(A).diagonal(i).sum() for i in range(-(n-1), n)]
Out[147]: [16, -6, 20, 29, 54, 58, 18, 31, 2]

In [148]: min([np.fliplr(A).diagonal(i).sum() for i in range(-(n-1), n)])
Out[148]: -6
→ Ссылка
Автор решения: n1tr0xs

Думаю, что не лучший вариант, но можно так:

A = [
    [1,  2,  3,  2],
    [2,  3,  4, 10],
    [1, -2,  3, -6],
    [16, 7, -2, 10],
]
n = len(A)
summ = 0
for col in range(n):
    for row in range(n):
        if A[row][col] < 0:
            break
        summ += A[row][col]
    else:
        print(f'Сумма {col} столбца: {summ}')

min_s = 0
# верхние диагонали
for start_j in range(n-2, -1, -1):
    i = 0
    j = start_j
    s = 0
    while i<n and j>=0:
        s += abs(A[i][j])
        i += 1
        j -= 1
    if s<min_s:
        min_s = s
# нижние диагонали
for start_i in range(1, n):
    i = start_i
    j = n-1
    s = 0
    while i<n and j>=0:
        s += abs(A[i][j])
        i += 1
        j -= 1
    if s<min_s:
        min_s = s

print("Минимум, среди сумм диагоналей паралельных побочной: ", min_s)
→ Ссылка
Автор решения: Павел Ериков

почему у меня ищется не по столбцам

потому что вы ищите по строкам!

У вас внутренний цикл отвечает за индекс столбца, потому что вы пишите: A[i][j], очевидно, чтобы идти по элементам столбца, нужно изменять индекс строки. То есть A[j][i]

Так же у вас опечатка, не sum = 0 нужно, а summ = 0.

И еще может все таки если у вас матрица целочисленная, то её элементы будут целыми?

A = np.random.randint(-10, 21, size=(n,n)) //случайное число от -10 до 21

почему то минимум во втором задание ищет по диагоналям параллельных главной

точно такая же проблема, как и в 1 задании. Вы сделали все наоборот (почему то я думаю, что вы у кого-то просто списали задание)

Вот кусок кода (остальное ничего не менялось):

row = -t if t < 0 else 0
col = i if t > 0 else n - 1
while row < n and col >= 0:
    sumArray += A[row][col]
    row += 1
    col -= 1
→ Ссылка