快速方法将列表列表(即从scipy.spatial.KDTree.query_ball_tree)转换为一对数组?

时间:2014-02-19 14:53:42

标签: python numpy scipy

我很难找到一种快速的方法将列表列表转换为一对数组。该对的第一个值是列表行的索引,第二个值由该列表行的列表中的每个值组成。如果该行是空列表,则不存在任何对,也不应该创建。

我希望得到类似于通过以下方式获得的结果:

    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个值。

1 个答案:

答案 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]