【问题标题】:How to create a 2D array of ranges using numpy如何使用 numpy 创建一个二维范围数组
【发布时间】:2019-05-16 16:19:44
【问题描述】:

我有一组开始和停止索引,如下所示:

    [[0, 3], [4, 7], [15, 18]]

我想构建一个 2D numpy 数组,其中每一行是对应的开始和停止索引对的范围,如下所示:

    [[0, 1, 2],
    [4, 5, 6],
    [15, 16, 18]]

目前,我正在创建一个空数组并将其填充到 for 循环中:

    ranges = numpy.empty((3, 3))
    a = [[0, 3], [4, 7], [15, 18]]

    for i, r in enumerate(a):
        ranges[i] = numpy.arange(r[0], r[1])

有没有更紧凑和(更重要的是)更快的方法来做到这一点?可能不涉及使用循环的东西?

【问题讨论】:

  • 随便np.asarray(a)[:, :1] + np.arange(a[0][1] - a[0][0])
  • 所有对的开始和停止之间的差异是否相同?
  • @Divakar,是的,它们是一样的

标签: python numpy


【解决方案1】:

一种方法是使用广播将左边缘添加到基本范围:

In [11]: np.arange(3) + np.array([0, 4, 15])[:, None]
Out[11]:
array([[ 0,  1,  2],
       [ 4,  5,  6],
       [15, 16, 17]])

注意:这要求所有范围的长度相同。

【讨论】:

  • 太棒了!谢谢。 @jdehesa 的解决方案也有效,但这似乎运行得更快
【解决方案2】:

如果范围要产生不同的长度,对于矢量化方法,您可以使用链接解决方案中的n_ranges

a = np.array([[0, 3], [4, 7], [15, 18]])

n_ranges(a[:,0], a[:,1], return_flat=False)
# [array([0, 1, 2]), array([4, 5, 6]), array([15, 16, 17])]

这也适用于以下数组:

a = np.array([[0, 3], [4, 9], [15, 18]])
n_ranges(*a.T, return_flat=False)
# [array([0, 1, 2]), array([4, 5, 6, 7, 8]), array([15, 16, 17])]

【讨论】:

  • 感谢您提供完整的解决方案,但我忘了在我的问题中明确说明范围都是相同的长度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 2013-07-16
相关资源
最近更新 更多