Как найти диагонали всех матриц в файле с помощью NumPy?

У меня есть файл, состоящий из нескольких матриц, разделенных пустой строкой. Как найти все диагонали всех матриц с помощью NumPy? Матрицы не фиксированного размера

1 2 3
1 1 1 
2 2 2

3 4 
3 2 
4 2 


3 2 3
4 2 2

person abd    schedule 07.03.2015    source источник
comment
Всегда ли матрицы в вашем файле имеют одинаковый размер (например, 3x3)?   -  person Alex Riley    schedule 07.03.2015
comment
Нет, матрицы разного размера.   -  person abd    schedule 07.03.2015


Ответы (1)


Вот рецепт для перебора файла в кусках, разделенных шаблоном регулярного выражения. Возможно, это немного мощнее, чем нужно здесь; шаблон регулярного выражения - это просто '\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]]
person unutbu    schedule 07.03.2015
comment
Но у меня есть матрицы переменного размера, так как я могу выбрать кусок перед пустой строкой, так как все матрицы разделены пустой строкой - person abd; 07.03.2015
comment
Приведенный выше код работает с массивами переменного размера. Пока строковые массивы разделены двумя или более символами конца строки, приведенный выше код будет работать. - person unutbu; 07.03.2015
comment
ошибка в строке кода выше arr = np.loadtxt(io.BytesIO(chunk)) не может преобразовать строку в float, поэтому я изменил ее на np.genfromtxt((chunk)) но теперь у меня нет диагоналей, я хочу получить все диагонали - person abd; 07.03.2015
comment
Ваш файл должен содержать нечисловые строки, которые вы не указали в своем вопросе выше. - person unutbu; 07.03.2015
comment
Он возвращает мне только одну диагональ, мне нужны все возможные диагонали, так что я могу сделать? - person abd; 07.03.2015
comment
Например, в приведенной выше первой матрице 1,1,2 || 1,2 || 2,1 - возможные диагонали, а у меня только одна диагональ 1,1,2 - person abd; 07.03.2015
comment
Чтобы другие посетители этой страницы могли более четко понять ваш вопрос, пожалуйста, отредактируйте свой вопрос, чтобы включить ожидаемый результат. - person unutbu; 07.03.2015
comment
Спасибо @unutbu за вашу помощь, я очень ценю это - person abd; 08.03.2015