У меня есть файл, состоящий из нескольких матриц, разделенных пустой строкой. Как найти все диагонали всех матриц с помощью NumPy? Матрицы не фиксированного размера
1 2 3
1 1 1
2 2 2
3 4
3 2
4 2
3 2 3
4 2 2
У меня есть файл, состоящий из нескольких матриц, разделенных пустой строкой. Как найти все диагонали всех матриц с помощью NumPy? Матрицы не фиксированного размера
1 2 3
1 1 1
2 2 2
3 4
3 2
4 2
3 2 3
4 2 2
Вот рецепт для перебора файла в кусках, разделенных шаблоном регулярного выражения. Возможно, это немного мощнее, чем нужно здесь; шаблон регулярного выражения - это просто '\n{2,}'
, то есть два или более символов конца строки. С другой стороны, если у вас есть этот инструмент, вам не нужно изобретать велосипед.
Когда у вас есть фрагмент — многострочная строка, представляющая массив — вы можете проанализировать его с помощью np.loadtxt
и найти все диагонали с помощью функции diagonals
:
import io
import re
import numpy as np
# http://stackoverflow.com/q/17508697/190597
def open_chunk(readfunc, delimiter, chunksize=1024):
"""
readfunc(chunksize) should return a string.
"""
remainder = ''
for chunk in iter(lambda: readfunc(chunksize), ''):
pieces = re.split(delimiter, remainder + chunk)
for piece in pieces[:-1]:
yield piece
remainder = pieces[-1]
if remainder:
yield remainder
# Based on http://stackoverflow.com/a/6313407/190597
def diagonals(L):
h, w = len(L), len(L[0])
return [[L[h - p + q - 1][q]
for q in range(max(p-h+1,0), min(p+1, w))]
for p in range(h + w - 1) ]
with open('data', 'r') as f:
for chunk in open_chunk(f.read, r'\n{2,}'):
arr = np.loadtxt(io.BytesIO(chunk))
print([d for d in diagonals(arr) if len(d) != 1])
урожаи
[[1.0, 2.0], [1.0, 1.0, 2.0], [2.0, 1.0]]
[[3.0, 2.0], [3.0, 2.0]]
[[3.0, 2.0], [2.0, 2.0]]