Помогите исправить код по целочисленной квадратной матрице
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)
У меня такое задание: Дана целочисленная квадратная матрица. Определить:
- Сумму элементов в тех столбцах, которые не содержат отрицательных элементов.
- Минимум среди сумм модулей элементов диагоналей, параллельных побочной диагонали матрицы
Появилось такая проблема, я не могу понять почему у меня ищется не по столбцам, а по строкам. А также почему то минимум во втором задание ищет по диагоналям параллельных главной, а не побочной.
Ответы (3 шт):
почему бы вам не использовать 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
Думаю, что не лучший вариант, но можно так:
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