Skip to main content
 首页 » 编程设计

python之使用索引数组进行高效循环

2025年05月04日19EasonJim

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

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、100、200、300、400)按顺序(即 0、1、2、3、4...)遍历索引数组。这些值不按顺序排列的原因是因为我正在分割边缘,这意味着新边缘被添加到索引数组的末尾(使用 vstack),而不是在适当的点插入索引数组。

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

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

制作:

0 
 
100 
 
200 
 
300 

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

请您参考如下方法:

方法 #1

获取索引数组的 argsort 和索引到值数组 -

value_array[index_array.argsort()] 

sample 运行-

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