如果我有一个包含所有唯一顺序值的索引数组,例如:
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)在循环之前重新排序是不是更好的做法,还是循环失序会产生性能成本?
答案 0 :(得分:5)
方法#1
获取索引数组和索引的argsort值数组 -
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