【发布时间】:2018-06-02 08:31:51
【问题描述】:
我正在尝试使用 matplotlib 绘制二维图像,它需要嵌套列表格式的数据点。我有一种非常简洁、惯用的方式来生成这个:
zs = [[cost_at(x, y) for x in x_range] for y in y_range]
plt.contourf(x_range, y_range, zs, 1000)
它适用于小数据。但是,我现在需要做完全相同的事情,除了 X 和 Y 的范围太大而无法将完整的嵌套列表放入内存中。在我看来,如果库通过迭代器访问它们,那么应该可以使用惰性列表调用 API,这有望成为足够的替代品。
除了惰性列表之外,还有什么方法可以完成上述操作?
【问题讨论】:
-
嵌套列表会发生什么?它走得很慢吗?所以你基本上想优化执行时间?
-
@J.C.Rocamonde X 和 Y 范围太大,整个嵌套列表无法放入内存
-
“在我看来应该可以使用惰性列表调用 API”——
plt.contourf()的文档是怎么说的? -
列表理解的惰性版本将是等效的生成器表达式!
-
为了生成等高线图,必须立即知道所有数据。虽然从技术上讲,当然可以编写一个轮廓算法来处理当前计算区域周围的部分数据,但这并不是 matplotlib 在内部的工作方式。同样在这样的算法中,您将无法处理数据的行和列。话虽如此,创建等高线图的方法是提供一个 numpy 数组。如果 numpy 数组对于内存来说太大了,将数组智能拼接成更小的部分可能是一种方法。
标签: python matplotlib generator iterable lazy-sequences