使用索引数组的高效循环

2024-04-25 18:51:22 发布

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

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

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

这对记忆有多敏感(我猜我需要使用努比。哪里)在循环之前重新排序是更好的做法,还是循环无序会带来性能成本?你知道吗


Tags: 代码inforindex顺序value原因序列
1条回答
网友
1楼 · 发布于 2024-04-25 18:51:22

进近#1

获取argsort for index数组和index into values数组-

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

相关问题 更多 >