将 numpy 数组转换为表格

将 numpy 数组转换为表格

我正在用 Python 进行一些数据分析,将结果以矩阵的形式存储在 numpy 数组中。我想将这些结果放入报告中,最好的方法是将表格放在包含数据的表格中。

是否有人知道从 python 输出 latex 代码的快速方法,或者我可以使用任何其他方法将数组快速格式化为 latex 可以处理的表格代码?

谢谢。

答案1

我已经有一段时间没有玩过 NumPy 了,但我曾经调用该numpy.savetxt函数将我的数据导出为以下.csv格式:

import numpy
A = numpy.random.randn(4,4)
numpy.savetxt("mydata.csv", A)

示例文件mydata.csv生成如下:

1.058690791897618361e-01 4.236767150069661314e-01 -9.871862191240249329e-02 1.896410657805123634e+00
-3.688082441801866507e-01 -6.185162583308108086e-01 7.779589745526608313e-01 -1.718082361568575633e+00
-2.750126418674324058e-01 1.636150392013778487e-01 -5.227282169549336555e-01 6.038835633452429574e-01
-1.113971762033877821e+00 -1.572603551712207670e+00 -6.206581544211196011e-01 -1.960843071998005893e+00

借助 的魔力pgfplotstable,我们可以做到以下几点:

\documentclass{article}

\usepackage{pgfplotstable}
\usepackage{array}

\begin{document}

\begin{table}
\centering
\pgfplotstabletypeset[dec sep align,
   fixed zerofill,
   precision=4,
   col sep=space]{mydata.csv}
\end{table}

\end{document}

Output 1

我不知道是否可以删除标题,但无论如何我都会向 Christian Feuersänger 询问。:)

我的好朋友敲击提供了一种删除这些标题的好方法:

\pgfplotstabletypeset[%
   fixed zerofill,
   precision=4,
   col sep=space,
   dec sep align,
   columns/0/.style ={column name=},
   columns/1/.style ={column name=},
   columns/2/.style ={column name=},
   columns/3/.style ={column name=},
]{mydata.csv}

另一种方法,是通过欺骗numpy.savetxt来扮演以下角色:

numpy.savetxt("mydata.csv", a, delimiter=' & ', fmt='%2.2e', newline=' \\\\\n')

这将为我们提供以下输出文件:

1.21e+00 & 3.52e-01 & -5.53e-01 & 7.28e-01 \\
-1.61e+00 & 6.72e-01 & 5.75e-01 & -1.00e+00 \\
3.60e-01 & 1.68e-01 & -1.65e+00 & 2.10e-01 \\
5.73e-01 & -7.29e-03 & 1.65e+00 & -1.37e+00 You could remove the last `\\` and paste it inside a `tabular` enviroment. And thanks to `siunitx`, we get a nice formatting:

\documentclass{article}

\usepackage{siunitx}

\begin{document}
\begin{table}
  \begin{center}
    \begin{tabular}{SSSS}
    1.21e+00 & 3.52e-01 & -5.53e-01 & 7.28e-01 \\
    -1.61e+00 & 6.72e-01 & 5.75e-01 & -1.00e+00 \\
    3.60e-01 & 1.68e-01 & -1.65e+00 & 2.10e-01 \\
    5.73e-01 & -7.29e-03 & 1.65e+00 & -1.37e+00
    \end{tabular}
  \end{center}
\end{table}
\end{document}

Output 2

最后但并非最不重要的一点是,datatool也可以使用。不幸的是,它似乎datatool无法将科学计数法识别为实数值,因此它将其视为字符串值。为了解决这个问题,我导出了文件.csv,使用逗号作为分隔符,并使用定点值:

numpy.savetxt("mydata.csv", a, delimiter=',', fmt='%2.2f')

这将生成以下输出:

1.24,-0.96,-1.51,-0.21
0.93,-1.37,0.30,-0.89
0.33,-0.16,-1.27,-0.02
1.08,1.22,0.29,0.15

现在,我们的 LaTeX 代码基于艾伦的回答

\documentclass{article}

\usepackage{datatool}
\usepackage{siunitx}

\begin{document}

\DTLloaddb[noheader, keys={0,1,2,3}]{db}{mydata.csv}

\begin{table}

  \sisetup{%
    parse-numbers=false,
    table-number-alignment=left,
    table-figures-integer=4,
    table-figures-decimal=4,
    input-decimal-markers={.}
  }
  \renewcommand*\dtlrealalign{S}

  \centering
  \DTLdisplaydb{db}
\end{table}

\end{document}

Output 3

通过使用\DTLdisplaydb,标头是必需的。如果您不想要它们,您可以改为迭代值的值.csv

您可以通过搜索标签来获取有关这些包的更多信息:

感谢杰克、打击乐手和艾伦。:)

答案2

工作于[SciPy-User] 二维数组转 Latex

$ python
Python 2.6.6(r266:84292,2010 年 12 月 26 日,22:31:48)
linux2 上的 [GCC 4.4.5]
输入“帮助”、“版权”、“信用”或“许可”以获取更多信息。
>>> 导入 numpy
>>> a = numpy.zeros((2,2))
>>> 打印“ \\\\\n”.join([“&”.join(map(str,line))for line in a])
0.0 & 0.0 \\
0.0 & 0.0
>>>

根据需要添加表格、表格和其他环境或命令。

答案3

有一个名为的 Python 包tabulate可以直接输出 Latex 表格。你可以在 pypi 上找到它这里

例如

import scipy
from tabulate import tabulate

a = scipy.random.rand(3,3)

print(tabulate(a, tablefmt="latex", floatfmt=".2f"))

输出类似

\begin{tabular}{rrr}
\hline
 0.97 & 0.48 & 0.76 \\
 0.56 & 0.52 & 0.86 \\
 1.00 & 0.11 & 0.25 \\
\hline
\end{tabular}

答案4

由于numpy.set_printoptions(precision=3)与 Mikes 的答案结合对我来说不起作用,所以这里有一个小升级,可以定义精度。

a = np.zeros((2,3))
print " \\\\\n".join([" & ".join(map('{0:.3f}'.format, line)) for line in a])

0:.3f通过将更改为所需的位数来改变精度。

或者

Python 3

print(" \\\\\n".join([" & ".join(map('{0:.3f}'.format, line)) for line in a]))

相关内容