【问题标题】:quick way to convert a list of lists (ie from scipy.spatial.KDTree.query_ball_tree) to an array of pairs?将列表列表(即从 scipy.spatial.KDTree.query_ball_tree)转换为对数组的快速方法?
【发布时间】: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 个值。

【问题讨论】:

  • 帮助我们帮助您。请您提供一个完整的示例:添加导入语句,为t1t2ntripoints 添加示例数据。让我们无需任何猜测或修改即可复制、粘贴和运行代码。
  • 嗨,我添加了更多信息并更正了三点位。我并没有真正生成大量的测试数据,所以不擅长这一点。主要是列表列表的转换,所以希望现在可以理解了。
  • @user1942439 一些最小的数据真的很有帮助。
  • "这里的要点是将列表列表例如...转换为对数组:(1,3), (1,5) (2,1) "。我很困惑。那2是哪里来的?你能更详细地解释一下“转换”是什么意思吗?
  • @user1942439 here is an example 如何提出这样的问题。该代码将直接在我的机器上运行。您应该通过随机生成或直接输入数据(例如np.array([1, 2, 3]))以作为 Python 代码的形式提供数据。

标签: python numpy scipy


【解决方案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]

【讨论】:

  • 谢谢,虽然我将元组转换为数组,但这对我来说是一个很大的进步
猜你喜欢
  • 2015-06-18
  • 2011-12-05
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 2016-01-31
  • 1970-01-01
相关资源
最近更新 更多