我很难找到一种快速的方法将列表列表转换为一对数组。该对的第一个值是列表行的索引,第二个值由该列表行的列表中的每个值组成。如果该行是空列表,则不存在任何对,也不应该创建。
我希望得到类似于通过以下方式获得的结果:
combarray = numpy.concatenate((t1, t2), axis=0)
tree = cKDTree(combarray)
pairlist = tree.query_pairs(r = distance )
pairs = numpy.array(list(pairlist))
points = len(t1)
check = numpy.logical_and(pairs[:,0] < points, pairs[:,1] >= points)
validpairs = pairs[check]
validpairs[:,1] -= points
遗憾的是,由于组合的两个数组的大小,两个点阵列的组合导致主tree.query_pairs调用大约使用t1tree.query_ball_tree(t2tree,r = distance)的两倍。如果我可以将KDTree.query球的结果有效地转换回对数组,那么它可能是更快的选择。
t1是3d中的一组顶点,而t2是3d中的一组不同的顶点。距离是建立“近”点的参数,其中一些点具有相同的顶点值,即我使用的值为0.02。这里的主要观点是转换列表列表,例如
row 0 : []
row 1 : [ 3, 5]
row 2 : [ 1 ]
row 3 : []
row 4 : [ 2 ]
到一对数组: [[1,3], [1,5], [2,1], [4,2]
大多数行都是空的,通常只有少数行(每行中的元素,即可能最多20行,但未知)。每组t1和t2值可以是3到大约3000个值。
答案 0 :(得分:1)
data = [
[],
[3,5],
[1]
]
pairs = []
for row_idx, row in enumerate(data):
for item in row:
pairs.append((row_idx, item))
print pairs
结果:
[(1, 3), (1, 5), (2, 1)]
或者,这种单行将产生相同的输出:
pairs = [(row_idx, item) for row_idx, row in enumerate(data) for item in row]