IPython `display` 到字符串

Syn*_*ica 4 python markdown ipython

我正在尝试使用该IPython.display模块将对象转换为 Markdown。但是,似乎没有什么好方法可以将这个 Markdown 导出为字符串。

行为:

>>> from IPython.display import *
>>> from numpy import *
>>> display_markdown(eye(3))
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
Run Code Online (Sandbox Code Playgroud)

通缉行为:

>>> display_markdown_string(eye(3))
"$$\left( ... \right)$$"
Run Code Online (Sandbox Code Playgroud)

有没有好的方法来实现这一目标?在我看来,这个功能必须在 IPython 中的某个地方出现,因为它可以在 Notebooks 中完成。

Mar*_*ers 5

你误解了什么是什么display_markdown()。它不是转换表示格式的功能。IPython 不使用 Markdown 来显示数组,它只是在这种特定情况下输出纯文本。

IPython的显示系统期望的对象,以提供格式化的输出本身,以及降价只是支持的不同格式之一。因为对象可以支持多种格式,所以有时您需要明确选择一种特定格式。display_markdown()允许您选择降价表示并忽略其他表示。但是,如果一个对象不具有特定的降价表示,其标准repr()的字符串来代替,作为后备。请参阅集成文档的Rich Display部分

Numpy 数组没有降价表示,因此display_markdown()没有任何用处。您看到的打印内容只是由repr(eye(3)). 所以你可以只使用repr(eye(3)), 并在降价中使用它,用反引号包裹它:

A = np.eye(3)
markdown_repr = f"```\n{A!r}\n```"
Run Code Online (Sandbox Code Playgroud)

!r语法告诉Python来采取的输出repr()。上面产生的字符串:

"```\narray([[1., 0., 0.],\n       [0., 1., 0.],\n       [0., 0., 1.]])\n```
Run Code Online (Sandbox Code Playgroud)

如果您想在 LaTeX 中表示数组,那么有些项目确实会生成您可以使用的 numpy 数组的表示;如果您将它们的结果包装$$在行中,那么您可以将它们视为降价输出,因为 Jupyter 支持嵌入式 Mathjax 表达式(LaTeX 的子集)。

例如,使用array-to-latex

from array_to_latex import to_ltx
to_markdown = lambda m: f"$$\n{to_ltx(m, print_out=False)}\n$$"
print(to_markdown(A))
Run Code Online (Sandbox Code Playgroud)

产生

A = np.eye(3)
markdown_repr = f"```\n{A!r}\n```"
Run Code Online (Sandbox Code Playgroud)

你不具备使用(你可以写自己的文字操作代码做同样的事情)图书馆,但你不能使用IPython的做到这一点。

当然,一旦你有了这样的函数,你不仅可以直接使用它,还可以教 IPython 将它用于任何 numpy 数组。您可以将其注册为text/markdownIPython的格式化程序,作为第三方格式化程序函数

md_formatter = get_ipython().display_formatter.formatters["text/markdown"]
md_formatter.for_type(np.ndarray, to_markdown)
Run Code Online (Sandbox Code Playgroud)

因为我使用的库输出 LaTeX,你可以直接使用to_ltx()(with print_out=False) 来生成 LaTeX 输出,这也会在你回显数组时产生 Mathjax 输出:

latex_formatter = get_ipython().display_formatter.formatters["text/latex"]
latex_formatter.for_type(np.ndarray, lambda m: to_ltx(m, print_out=False))
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,现在您都会看到数组的 MathJax 渲染:

带有 numpy 矩阵的 LaTeX 表示的笔记本演示

现在,如果你想访问不同格式的对象可令IPython的,那么你要使用的IPython.core.formatters.format_display_data()功能; 这为您提供了两个字典,第一个是一个以各种表示 mime 类型作为键的字典。如果对象有可用的降价转换,那么您会在"text/markdown"键下找到它:

from IPython.core.formatters import format_display_data
formatted, metadata = format_display_data(A)
formatted["text/markdown"]
Run Code Online (Sandbox Code Playgroud)

因为我已经为 numpy 数组注册了一个 Markdown 格式化程序,所以上面to_markdown()为我们生成了输出:

'$$\n\\begin{bmatrix}\n  1.00 &  0.00 &  0.00\\\\\n  0.00 &  1.00 &  0.00\\\\\n  0.00 &  0.00 &  1.00\n\\end{bmatrix}\n$$'
Run Code Online (Sandbox Code Playgroud)

但是如果没有额外的丰富显示注册,你得到的只是一个"text/plain"条目。