我有一个开始和停止索引数组,如下所示:
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]]
是否有更紧凑,更重要(更重要)的方法?可能不涉及使用循环的事情?
答案 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])]