【问题标题】:IPython `display` to stringIPython`显示`到字符串
【发布时间】:2020-04-11 23:27:21
【问题描述】:

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

行为:

>>> from IPython.display import *
>>> from numpy import *
>>> display_markdown(eye(3))
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

想要的行为:

>>> display_markdown_string(eye(3))
"$$\left( ... \right)$$"

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

【问题讨论】:

  • @Synthetica,您能否确认我对问题的理解:您希望从display_markdown 返回的降价对象的字符串表示形式,并且此字符串对象必须也包含 Latex ?请问你能具体说明你想要什么吗?对于 Pandas 数据框,您不希望使用字符串表示的 Latex 表,但这会改变原始要求?
  • @amanb 正确,我想要 Markdown 对象的字符串表示。这种表示不需要包含降价,但我怀疑它经常会。
  • display_markdown(eye(3)) 我没有得到任何东西。我不得不使用display_markdown(str(eye(3)), raw=True),在markdown中获得一个内联数组:[[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]
  • @Synthetica:但是没有 Markdown 对象。甚至没有任何降价。如果输入没有可用的降价版本,display_markdown() 不会输出降价。为您的显示器生成的只是纯文本

标签: python ipython markdown


【解决方案1】:

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

IPython 显示系统希望对象提供格式化的输出它们自己,markdown 只是支持的不同格式之一。因为对象可以支持多种格式,所以您有时需要明确选择一种特定格式。 display_markdown() 允许您选择降价表示并忽略其他表示。但是如果一个对象没有一个特定的降价表示,它的标准repr() 字符串会被使用,作为一个后备。请参阅集成文档的Rich Display section

Numpy 数组没有降价表示,所以 display_markdown() 没有任何可使用的。您看到的打印只是repr(eye(3)) 生成的字符串。所以你可以只使用repr(eye(3)),并在markdown中使用它,用反引号括起来:

A = np.eye(3)
markdown_repr = f"```\n{A!r}\n```"

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

"```\narray([[1., 0., 0.],\n       [0., 1., 0.],\n       [0., 0., 1.]])\n```

如果您想在 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))

生产

$$
\begin{bmatrix}
  1.00 &  0.00 &  0.00\\
  0.00 &  1.00 &  0.00\\
  0.00 &  0.00 &  1.00
\end{bmatrix}
$$

您没有使用库(您可以编写自己的文本操作代码来执行类似的操作),但您不能使用 IPython 来执行此操作。强>

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

md_formatter = get_ipython().display_formatter.formatters["text/markdown"]
md_formatter.for_type(np.ndarray, to_markdown)

因为我使用的库输出 LaTeX,所以您可以直接使用 to_ltx()(使用 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))

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

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

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

因为我已经为 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$$'

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

【讨论】:

    猜你喜欢
    • 2014-07-04
    • 1970-01-01
    • 2016-05-19
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多