我正在用 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}
我不知道是否可以删除标题,但无论如何我都会向 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}
最后但并非最不重要的一点是,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}
通过使用\DTLdisplaydb
,标头是必需的。如果您不想要它们,您可以改为迭代值的值.csv
。
您可以通过搜索标签来获取有关这些包的更多信息:希尼奇,数据工具,pgfplotstable
感谢杰克、打击乐手和艾伦。:)
答案2
$ 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]))