【问题标题】:How can I find the diagonals of all matrices in a file using NumPy?如何使用 NumPy 找到文件中所有矩阵的对角线?
【发布时间】:2015-05-09 05:20:24
【问题描述】:

我有一个文件,其中包含许多由空行分隔的矩阵。如何使用 NumPy 找到所有矩阵的所有对角线?矩阵不是固定大小的

1 2 3
1 1 1 
2 2 2

3 4 
3 2 
4 2 


3 2 3
4 2 2

【问题讨论】:

  • 文件中的矩阵是否总是相同的大小(例如 3x3)?
  • 没有不同大小的矩阵

标签: python numpy matrix diagonal


【解决方案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]]

【讨论】:

  • 但是我有大小可变的矩阵,所以我如何选择空行之前的块,因为每个矩阵都用空行分隔
  • 上面的代码适用于可变大小的数组。只要字符串数组由 2 个或更多行尾字符分隔,上面的代码就可以工作。
  • 上述代码行中的错误 arr = np.loadtxt(io.BytesIO(chunk)) 无法将字符串转换为浮点数,因此我将其更改为 np.genfromtxt((chunk)) 但现在我得到了没有对角线我想得到所有对角线
  • 您的文件必须包含您在上述问题中未显示的非数字字符串。
  • 它只返回一个对角线我想要所有可能的对角线所以我该怎么办?
猜你喜欢
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多