使用索引数组的高效循环



如果我有一个包含所有唯一顺序值的索引数组,例如:

index_array = array([0, 4, 2, 5, 6, 1, 3, 7, 8])

使用相应的值数组:

value_array = array([0, 400, 200, 500 600, 100, 300, 700, 800])

是否可以按顺序循环访问索引数组,以便我得到

array([0, 100, 200, 300, 400, 500, 600, 700, 800])

我需要按顺序(即 0, 1, 2, 3, 4...(和相应的值(即 0、100、200、300、400(遍历索引数组。这些值不按顺序排列的原因是因为我正在细分边缘,这意味着新边缘被添加到索引数组的末尾(使用 vstack(,而不是插入到索引数组的适当点。

伪代码(如果我打印出值(将是这样的:

for point in sorted(index_array):
    print sorted(point(value_array))

生产:

0
100
200
300

这对内存有多敏感(我猜我需要使用 numpy.where(在循环之前重新排序只是更好的做法,还是无序循环会有性能成本?

方法 #1

获取索引数组的参数排序和索引为值数组 -

value_array[index_array.argsort()]

示例运行 -

In [129]: value_array
Out[129]: array([   0,  400,  200,  500,  600,  100,  300,  700, 800])
In [130]: index_array
Out[130]: array([0, 4, 2, 5, 6, 1, 3, 7, 8])
In [131]: value_array[index_array.argsort()]
Out[131]: array([   0,  100,  200,  300,  400,  500,  600,  700, 800])

方法 #2 滥用index_array中的所有元素都是唯一且顺序的事实,一种更快的方法是初始化一个输出数组并使用这些索引来索引并将这些值从value_array分配到其中,如下所示 -

def assign_unique_seq(value_array, index_array):
    out = np.empty_like(value_array)
    out[index_array] = value_array
    return out

运行时测试 -

In [152]: value_array = np.random.randint(0,1000000,(100000))
# Create unique and sequential indices array
In [153]: index_array = np.random.permutation(len(value_array))
In [154]: %timeit value_array[index_array.argsort()]
100 loops, best of 3: 7.84 ms per loop
In [155]: %timeit assign_unique_seq(value_array, index_array)
1000 loops, best of 3: 240 µs per loop

最新更新