【问题标题】:Python nested lazy listsPython 嵌套惰性列表
【发布时间】: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


【解决方案1】:

在 Python 中,可以使用生成器表达式创建“惰性列表”:

zs = ((cost_at(x, y) for x in x_range) for y in y_range)

通过使用圆括号代替方括号,您可以创建一个嵌套的生成器表达式,它一次提供一个cost_at(x, y),而不是一次计算它们。

【讨论】:

  • 完美解决方案!作为记录, plt.contourf 遗憾地证明不接受生成器,但这对于其他上下文仍然是一个很好的解决方案。谢谢!
  • 接受一个最终不起作用的答案不是很令人困惑吗?这样未来的读者会认为他们可以使用生成器通过 matplotlib 绘制等高线图 - 事实并非如此。
  • @ImportanceOfBeingErnest 这就是我添加该评论的原因。这不像我期待一个适用于 matplotlib 的替代答案。
猜你喜欢
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多