Numpy 행렬을 Latex 용으로 출력

9899 단어 Python3LaTeXnumpy

목표



보통 numpy ndarray를 인쇄하면
[[ 9.999e+00 -1.000e-03 -1.000e-03]
 [-1.000e-03  9.999e+00 -1.000e-03]
 [-1.000e-03 -1.000e-03  9.999e+00]]

처럼 된다.
이 ndarray를 latex로 컴파일할 수 있는 형태로 출력시키고 싶다.
즉, 이 ndarray를 주면,

\begin{pmatrix}
    \ 9.999 & -0.001 & -0.001 \\
    -0.001 & \ 9.999 & -0.001 \\
    -0.001 & -0.001 & \ 9.999 \\
\end{pmatrix}

같은 출력을 하는 함수를 만든다. 이것이 있다면




\documentclass[12pt]{article}
\usepackage{amsmath}
\begin{document}
\begin{align*}
\begin{pmatrix}
    \ 9.999 & -0.001 & -0.001 \\
    -0.001 & \ 9.999 & -0.001 \\
    -0.001 & -0.001 & \ 9.999 \\
\end{pmatrix}
\end{align*}
\end{document}

만드는 법



우선, 행렬의 행수와 열의 수는, numpy.array.shape로 tuple로서 취득할 수 있다.
tuple에 (행수, 열수)로서 들어 있기 때문에 이것을 각각 변수에 넣는다.
5. 데이터 구조 — Python 3.8.5 문서
import numpy as np
matrix = np.ones((3,3))
 _, max_column = matrix.shape

이번에는 행수는 사용하지 않기 때문에, 사용하지 않는다는 의미를 담아_라고 하는 변수로서 썼다.

만든 함수


def str_2dmatrix_latex(matrix, indent=4, digit=3, env="pmatrix"):
    r"""
    Convert 2d matrix to str for latex.
    *In your latex preset, you must add
    amsmath

    Parameters
    ----------
    matrix : numpy.ndarray
        2d matrix
    indent : int
        indent width
        if indent is -1, indent become tab
    digit : int
        digit=2 0.11
        digit=3 0.111
    env : str
        env is inserted ... in \begin{...}
        and \end{...}

    Return
    ------
    str
    """
    _, max_column = matrix.shape
    if indent == -1:
        str_indent = "\t"
    else:
        str_indent = " " * indent
    list_str = []
    list_str.append(r"\begin{" + f"{env}" + "}\n")
    for row in matrix:
        for j, elem in enumerate(row):
            str_elem = f"{elem:.{digit}f}"
            # format
            if elem > 0:
                str_elem = r"\ " + str_elem
            # write matrix element
            if j == 0:
                list_str.append(str_indent + str_elem + " & ")
            elif j == max_column - 1:
                list_str.append(str_elem + r" \\" + "\n")
            else:
                list_str.append(str_elem + " & ")
    list_str.append(r"\end{" + f"{env}" + "}\n")
    return "".join(list_str)


def main():
    one_mat = np.ones((3, 3))
    """
     1 1 1
     1 1 1
     1 1 1
    """
    id_mat = np.eye(3)
    """
     1 0 0
     0 1 0
     0 0 1
    """
    mat = 10 * id_mat - 0.001 * one_mat
    print(str_2dmatrix_latex(mat))


if __name__ == "__main__":
    main()


실행 결과
\begin{pmatrix}
    \ 9.999 & -0.001 & -0.001 \\
    -0.001 & \ 9.999 & -0.001 \\
    -0.001 & -0.001 & \ 9.999 \\
\end{pmatrix}

좋은 웹페이지 즐겨찾기