Numpy 2d和1d阵列到乳胶bmatrix

The*_*eer 6 python latex numpy

我正在寻找一种将numpy数组迁移到latex bmatrix的简洁方法.它应该适用于2d阵列和水平和垂直1d阵列.

A = array([[12, 5, 2],
           [20, 4, 8],
           [ 2, 4, 3],
           [ 7, 1,10]])

print A              #2d array
print A[0]           #horizontal array
print A[:,0, None]   #vertical array

array_to_bmatrix(A)
array_to_bmatrix(A[0])
array_to_bmatrix(A[:,0, None])
Run Code Online (Sandbox Code Playgroud)

日期:

[[12  5  2]
 [20  4  8]
 [ 2  4  3]
 [ 7  1 10]]

[12  5  2]

[[12]
 [20]
 [ 2]
 [ 7]]

\begin{bmatrix} 
 12.000 & 5.000 & 2.000 & \\
 20.000 & 4.000 & 8.000 & \\
 2.000 & 4.000 & 3.000 & \\
 7.000 & 1.000 & 10.000 & \\
\end{bmatrix}

\begin{bmatrix} 
 12.000 & 5.000 & 2.000
\end{bmatrix}

\begin{bmatrix} 
 12.000 & \\
 20.000 & \\
 2.000 & \\
 7.000 & \\
\end{bmatrix}
Run Code Online (Sandbox Code Playgroud)

尝试解决方案

def array_to_bmatrix(array):
    begin = '\\begin{bmatrix} \n'
    data = ''
    for line in array:        
        if line.size == 1:
            data = data + ' %.3f &'%line
            data = data + r' \\'
            data = data + '\n'
            continue
        for element in line:
            data = data + ' %.3f &'%element

        data = data + r' \\'
        data = data + '\n'
    end = '\end{bmatrix}'
    print begin + data + end  
Run Code Online (Sandbox Code Playgroud)

此解决方案适用于垂直和2d阵列,但它将水平阵列输出为垂直阵列.

array_to_bmatrix(A[0])
Run Code Online (Sandbox Code Playgroud)

日期:

\begin{bmatrix} 
 12.000 & \\
 5.000 & \\
 2.000 & \\
\end{bmatrix}
Run Code Online (Sandbox Code Playgroud)

Rol*_*ith 16

__str__numpy数组的方法已经为您完成了大部分格式化.让我们利用它;

import numpy as np

def bmatrix(a):
    """Returns a LaTeX bmatrix

    :a: numpy array
    :returns: LaTeX bmatrix as a string
    """
    if len(a.shape) > 2:
        raise ValueError('bmatrix can at most display two dimensions')
    lines = str(a).replace('[', '').replace(']', '').splitlines()
    rv = [r'\begin{bmatrix}']
    rv += ['  ' + ' & '.join(l.split()) + r'\\' for l in lines]
    rv +=  [r'\end{bmatrix}']
    return '\n'.join(rv)

A = np.array([[12, 5, 2], [20, 4, 8], [ 2, 4, 3], [ 7, 1, 10]])
print bmatrix(A) + '\n'

B = np.array([[1.2], [3.7], [0.2]])
print bmatrix(B) + '\n'

C = np.array([1.2, 9.3, 0.6, -2.1])
print bmatrix(C) + '\n'
Run Code Online (Sandbox Code Playgroud)

返回:

\begin{bmatrix}
  12 & 5 & 2\\
  20 & 4 & 8\\
  2 & 4 & 3\\
  7 & 1 & 10\\
\end{bmatrix}

\begin{bmatrix}
  1.2\\
  3.7\\
  0.2\\
\end{bmatrix}

\begin{bmatrix}
  1.2 & 9.3 & 0.6 & -2.1\\
\end{bmatrix}
Run Code Online (Sandbox Code Playgroud)

  • 这对于行数较长的矩阵存在问题——它将在行中间插入“\\”,因为“str(a)”具有最大行宽。为了解决这个问题,我将“bmatrix”函数中的“str(a)”替换为“np.array2string(a, max_line_width=np.infty)”,这使得行可以是完整长度。这还可以更好地控制其他字符串表示形式选择,例如精度和格式。 (2认同)

Jos*_*ter 5

尝试array_to_latex (pip install)。我就是因为这个原因才写的。不足之处请提供您的反馈。

它具有默认值,但也允许您自定义格式(指数、小数位数)并处理复数,并且可以将结果直接“弹出”到剪贴板中(无需复制转储到屏幕上的文本)。

github 存储库中的一些示例。https://github.com/josephcslater/array_to_latex