Сравнение нескольких матриц на Python с выводом матрицы совпадающих элементов
Нужно сравнить в Пайтоне несколько матриц равной размерности, и вывести после сравнения матрицу, где в случае наличия во всех сравниваемых матрицах одинаковых элементов в одних и тех же местах тоже будет стоять этот элемент. Разумеется, итоговая матрица имеет тот же размер что и сравниваемые исходные. Там где в сравниваемых матрицах нет общего элемента должны стоять произвольные символы.
Этот код работает не вполне точно.
from copy import deepcopy
from random import randint
import numpy as nm
def matrix_generator(Q, N):
"""Function generates Q matrix with size NxN and pack them into list """
matrix_list = list()
for i in range(Q):
matrix_list.append([])
for matrix in matrix_list:
for j in range(N):
matrix.append([])
for matrix in matrix_list:
for line in matrix:
for k in range(N):
line.append(randint(0, 9))
print("Matrix list is: ", matrix_list, "\n")
return matrix_list
arrays = matrix_generator(3, 3)
result = deepcopy(arrays[0])
for i in range(len(result)):
for j in range(len(result[i])):
result[i][j] = "x"
first = arrays[0]
print("First matrix is: ", first, "\n")
# arrays.remove(arrays[0])
for array in arrays:
# print("Current analyzing array is: ", array)
for line in array:
k = array.index(line)
for item in line:
l = line.index(item)
# print(first[k][l], array[k][l])
if first[k][l] == array[k][l]:
result[k][l] = first[k][l]
# print("MATCH!")
else:
result[k][l] = "x"
print("Result of compare is", result)
Ответы (2 шт):
проблема вероятнее всего здесь
l = line.index(item)
это вернёт индек первого встречного элемента, поэтому лучше использовать range
for array in arrays:
# print("Current analyzing array is: ", array)
for k in range(len(array)):
line = array[k]
for l in range(len(line)):
item = line[l]
# print(first[k][l], array[k][l])
if first[k][l] == array[k][l]:
result[k][l] = first[k][l]
# print("MATCH!")
else:
result[k][l] = "x"
print("Result of compare is", result)
либо используйте функцию enumerate
for array in arrays:
# print("Current analyzing array is: ", array)
for k, line in enumerate(array):
for l, item in enumerate(line):
# print(first[k][l], array[k][l])
if first[k][l] == array[k][l]:
result[k][l] = first[k][l]
# print("MATCH!")
else:
result[k][l] = "x"
print("Result of compare is", result)
Ошибка в цикле сравнения (если честно, я не особо разобрался/разбирался в ней, но, как сказали выше, сколее всего ошибка из-за .index()), но вот вполне рабочий код:
from copy import deepcopy
from random import randint
def matrix_generator(Q, N):
matrix_list = [[[randint(0, 9)
for matrix_width in range(N)]
for matrix_height in range(N)]
for matrix in range(Q)]
return matrix_list
def compare_matrix(arrays, symbol='x'):
result = deepcopy(arrays[0])
for matrix in arrays:
for line in range(len(matrix)):
for elem in range(len(matrix[line])):
if not result[line][elem] == matrix[line][elem]:
result[line][elem] = symbol
return result
arrays = matrix_generator(3, 3)
## Следующие закомменченные строчки можно удалить, они из idle
# print(arrays)
# >>> [[[2, 1, 0], [7, 7, 4], [6, 9, 6]], [[5, 0, 5], [9, 9, 7], [4, 5, 5]], [[1, 8, 8], [8, 2, 8], [9, 2, 9]]]
## Заменяем каждый [0,0], [1,1], [2,2] на 1, 2, 3
# arrays = [[[1, 1, 0], [7, 2, 4], [6, 9, 3]], [[1, 0, 5], [9, 2, 7], [4, 5, 3]], [[1, 8, 8], [8, 2, 8], [9, 2, 3]]]
compare_matrix(arrays)
# >>> [[1, 'x', 'x'], ['x', 2, 'x'], ['x', 'x', 3]]