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

2024-04-25 06:37:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

    [[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])

有没有更紧凑(更重要)更快的方法?可能是不需要使用循环的东西?你知道吗


Tags: 方法innumpyfor数组emptyrangesenumerate
2条回答

如果范围导致不同的长度,对于向量化方法,可以使用链接解决方案中的^{}

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])]

一种方法是使用广播将左手边添加到基本排列:

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

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

相关问题 更多 >