我正在编写决策树,以下代码是完整代码的一部分:
def show_tree(tree, features, path):
f = io.StringIO()
export_graphviz(tree, out_file=f, feature_names=features)
pydotplus.graph_from_dot_data(f.getvalue()).write_png(path)
img = misc.imread(path)
plt.rcParams['figure.figsize'] = (20,20)
plt.imshow(img)
请问任何人请告诉我在这里使用StringIO的目的是什么?
Python不是我的主要语言,但我认为你的问题的答案很简单,不需要很多研究。
StringIO用于维护输入/输出文本流。你的功能显示树,但是为了做到这一点它需要一种方法来做,某种数据传输高速公路。
在这里f = io.StringIO()
你正在初始化你的数据流。在此之后,您可以随意使用它,在这种特殊情况下:
export_graphviz(tree, out_file=f, feature_names=features)
这里:out_file=f
您使用f = io.StringIO();
之前初始化的数据将数据导出到您的流。由于StringIO是内存中的文本文件,因此您基本上将数据放在流对象中以供进一步使用。多亏了你不必将你的数据写入.dot文件,而是暂时保存它。(只要你的流正在使用中,临时意味着)
More about this particular case
pydotplus.graph_from_dot_data(f.getvalue()).write_png(path)
在这里:f.getvalue()
您从.dot数据生成图表。在最基本的用途中,你应该确保.dot文件的路径,在该文件中存储以前生成的数据,但是你没有必要!这就是诀窍,你的数据仍然是你预先创建和填充的流对象!因此,现在您只需将其直接指向此功能,该功能将生成包含该数据的图形图像并将其另存为.png文件。
系统文件和程序之间的通信可以通过多种方式建立,但通常使用流。您在开始时初始化流,使用它然后关闭。每个std::cout
或std:err
(我的主要语言参考,抱歉非python示例)就是那个流。 Stream允许您维护程序和指定tagret之间的数据交换(例如控制台或本例文件),但是您也可以将其用作临时存储空间,在这种情况下,您可以加快图像生成过程,因为您不需要真的要编写并将数据加载到文件中。所有你需要做的就是将数据写入其他函数将接受的顺序流,然后使用相同的流来读取该数据以用于图像生成目的。
StringIO表示内存中的文本文件。它可以与任何文本文件完全相同使用,因此您可以从中进行写入/读取。访问速度比常规文件快,因为stringio缓冲区是在内存中管理的,但另一方面它在磁盘上不是持久的。
在您给出的示例中,您还可以使用常规文本文件。
这是一个常规点文本文件的示例:
def show_tree(tree, features, path):
f = 'tree.dot'
export_graphviz(tree, out_file=f, feature_names=features)
pydotplus.graph_from_dot_file(f).write_png(path)
img = misc.imread(path)
plt.rcParams['figure.figsize'] = (20,20)
plt.imshow(img)
这是另一个没有文件和没有StringIO的例子,只使用export_graphviz()导出的点文件的字符串内容
def show_tree(tree, features, path):
dot_data = export_graphviz(tree, out_file=None, feature_names=features)
pydotplus.graph_from_dot_data(dot_data).write_png(path)
img = misc.imread(path)
plt.rcParams['figure.figsize'] = (20,20)
plt.imshow(img)