要解释我想做什么有点难,所以最好的方法是展示一个我认为的例子。 我有一个2D numpy数组,其中包含一个整数对列表。这些整数从0到N,每个都出现在2对列表中,除了其中两个(将被称为极值)。因此该列表包含N-1对。
我想重新排序数组,让它从包含极值的一对开始,然后让前一对开始的下一对...非常混乱,所以看看这个例子: 我从这个数组开始:
array([[3, 0], [3, 2], [4, 0], [1, 2]])
我想最终得到这个:
array([[1, 2], [2, 3], [3, 0], [0, 4]])
这是一个有效的算法但它包含一个N-1循环......在这种情况下它不是问题,因为N = 5但是我想用N = 100000或更多,所以我想没有显式的python循环但是无法找到方法......
import numpy as np
co = np.array([[3, 0], [3, 2], [4, 0], [1, 2]])
extrema = np.nonzero(np.bincount(co.flat) == 1)[0]
nb_el = co.shape[0]
new_co = np.empty_like(co)
start = extrema[0]
for el_idx in xrange(nb_el):
where_idx = np.where(co == start)
if where_idx[1][0] == 1:
new_co[el_idx] = co[where_idx[0][0]][::-1]
else:
new_co[el_idx] = co[where_idx[0][0]]
co = np.delete(co, where_idx[0], 0)
start = new_co[el_idx][-1]
print new_co
# array([[1, 2], [2, 3], [3, 0], [0, 4]])