【问题标题】:Array of ranges with numpy带有 numpy 的范围数组
【发布时间】:2011-03-13 00:12:37
【问题描述】:

我有以下数组:

>>> x = numpy.array([2,4,2,3,1])
>>> x
array([2, 4, 2, 3, 1])

我想要一个包含这些值范围的数组。我可以这样创建它:

>>> numpy.hstack( (numpy.arange(v) for v in x) )
array([0, 1, 0, 1, 2, 3, 0, 1, 0, 1, 2, 0])

鉴于x,有没有一种更快的方法来使用 numpy 生成它而无需使用 for 循环?

【问题讨论】:

  • 看起来您找到了解决方案...知道您为什么需要它以及为什么采用这种特定格式会很有趣。
  • 我正在努力加速 pycollada 库 (github.com/pycollada/pycollada)。 collada 格式的几何类型之一称为 polylist,它将每个多边形的顶点数存储在一个数组中,如上面的x。我需要设置输出范围以在单个数组中快速对多边形进行三角剖分。
  • 你可以在我在这个提交中创建的 triangleset() 函数中看到它是如何工作的:github.com/pycollada/pycollada/commit/…

标签: python optimization numpy


【解决方案1】:

我想通了:

>>> x
array([2, 4, 2, 3, 1])
>>> ends = numpy.cumsum(x)
>>> ranges = numpy.arange(ends[-1])
>>> ranges = ranges - numpy.repeat(ends-x, x)
>>> ranges
array([0, 1, 0, 1, 2, 3, 0, 1, 0, 1, 2, 0])
>>> 

【讨论】:

    【解决方案2】:

    这实际上更快吗? 我也有类似的需求,

    concatenate([range(l, r) for l, r in array((left, right)).T])

    是两倍的速度

    range(end[-1]) + repeat(left + end, right-left)

    end = cumsum(right - left) 就像你的一样)。

    (在我非常短暂的经验中,重复非常慢——至少在 python 3.6 中)

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多