如何使用numpy创建范围的二维数组

时间:2019-05-16 16:19:44

标签: python numpy

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

private void bubbleDown(int index)
{
    boolean found = false;
    while(!found && (2*index +1) < size)
    {
        int left = leftChild(index) + 1;
        int right = rightChild(index) + 1;
        int child = left;

        if((index*2 +2) < size && elementData[right].compareTo(elementData[left]) > 0)
        {
            child = right;
        }
        if(elementData[index].compareTo(elementData[child]) < 0)
        {
            swap(elementData, index, child);
            index = child;
        }
        else
        {
            found = true;
        }
    }
}

并且我想构造一个2D numpy数组,其中每一行都是从相应的开始和结束索引对开始的范围,如下所示:

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

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

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

是否有更紧凑,更重要(更重要)的方法?可能不涉及使用循环的事情?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

如果范围导致不同的长度,对于矢量化方法,可以使用链接的解决方案中的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])]