Сначала прочитайте текстовый файл и получите содержимое строки в массив numpy, с помощью этого:
with open('test1.txt', 'r') as f:
all_lines = f.readlines()
mat_shape = tuple(map(int, all_lines[0].split()))
lines = [i.strip().split() for i in all_lines[1:]]
lines = np.array(lines)
Прочитайте первую строку текстового файла, разбейте, отобразите их в int и сохраните вкортеж, поскольку мы используем его для изменения размера нашей матрицы позже.
lines
будет выглядеть так:
[['*' 'o' 'o' 'o' 'o' '*']
['o' 'o' '*' 'o' 'o' 'o']
['o' 'o' '*' 'o' 'o' '*']
['o' 'o' '*' 'o' 'o' 'o']
['o' 'o' 'o' 'o' '*' 'o']
['o' 'o' 'o' 'o' 'o' 'o']]
Получить соседние элементы для каждой ячейки матрицы, с помощью этой функции:
def get_neighbours(lines, cell):
row, col = cell
row_max = len(lines)
col_max = len(lines[0])
cell_cont = lines[row][col]
if cell_cont!="*":
return [lines[row_d + row][col_d + col] for col_d in [-1,0,1] if (0 <= (col_d + col) < col_max) or (col_d == 0 and row_d==0) for row_d in [-1,0,1] if 0 <= (row_d + row) < row_max ].count('*')
else:
return '*'
Функция принимает всю матрицу и определенную ячейку, которая является кортежем номера строки и столбца.Он возвращает только '*'
, если в ячейке есть звезда, в противном случае целое число - количество звезд в соседних соседних ячейках.
Теперь создайте новый массив и вызовите эту функцию для каждой ячейкиmatrix:
new = []
for i,_ in enumerate(lines):
for j,_ in enumerate(lines[i]):
new.append(get_neighbours(lines, (i,j)))
new = np.array(new)
Если вы теперь преобразуете эту матрицу в желаемый формат следующим образом:
new = new.reshape(mat_shape)
Она становится:
[['*' '2' '1' '1' '1' '*']
['1' '3' '*' '2' '2' '2']
['0' '3' '*' '3' '1' '*']
['0' '2' '*' '3' '2' '2']
['0' '1' '1' '2' '*' '1']
['0' '0' '0' '1' '1' '1']]
Вы можете записать это вновый текстовый файл с таким именем:
with open('new1.txt', 'w') as f:
f.write(all_lines[0])
for i in new:
f.write(' '.join(i))
f.write('\n')
В файл new1.txt
будет записано следующее содержимое:
6 6
* 2 1 1 1 *
1 3 * 2 2 2
0 3 * 3 1 *
0 2 * 2 2 2
0 1 1 2 * 1
0 0 0 1 1 1