【发布时间】:2014-02-19 14:53:42
【问题描述】:
我正在努力寻找一种将列表列表转换为对数组的快速方法。该对的第一个值是列表行的索引,第二个值由该列表行的列表中的每个值组成。如果该行是一个空列表,则不存在任何对并且不应创建。
我希望得到类似于通过以下方式获得的结果:
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 个值。
【问题讨论】:
-
帮助我们帮助您。请您提供一个完整的示例:添加导入语句,为
t1和t2和ntripoints添加示例数据。让我们无需任何猜测或修改即可复制、粘贴和运行代码。 -
嗨,我添加了更多信息并更正了三点位。我并没有真正生成大量的测试数据,所以不擅长这一点。主要是列表列表的转换,所以希望现在可以理解了。
-
@user1942439 一些最小的数据真的很有帮助。
-
"这里的要点是将列表列表例如...转换为对数组:(1,3), (1,5) (2,1) "。我很困惑。那2是哪里来的?你能更详细地解释一下“转换”是什么意思吗?
-
@user1942439 here is an example 如何提出这样的问题。该代码将直接在我的机器上运行。您应该通过随机生成或直接输入数据(例如
np.array([1, 2, 3]))以作为 Python 代码的形式提供数据。