Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有效地用坐标分隔列表_Python_List_Performance_Coordinates_List Comprehension - Fatal编程技术网

Python 有效地用坐标分隔列表

Python 有效地用坐标分隔列表,python,list,performance,coordinates,list-comprehension,Python,List,Performance,Coordinates,List Comprehension,我有一个包含索引和坐标的列表,形式为[I,x,y],例如: nodes=[[0,1,1][1,1,2],[2,2,3],[3,2,5][......]] 我想用坐标把这个列表分成更小的列表。例如,其中的所有坐标 0.5<x<2.5 and 1<y<2.5 目前我的代码是这样的: addNODE=[] deleteNODE=[] tl=0.0001 for node in nodes: if (((Xmin-tl) <= node[1] <= (Xm

我有一个包含索引和坐标的列表,形式为[I,x,y],例如:

nodes=[[0,1,1][1,1,2],[2,2,3],[3,2,5][......]]
我想用坐标把这个列表分成更小的列表。例如,其中的所有坐标

 0.5<x<2.5 and 1<y<2.5
目前我的代码是这样的:

addNODE=[]
deleteNODE=[]
tl=0.0001
for node in nodes:
   if (((Xmin-tl) <= node[1] <= (Xmax+tl)) and ((Ymin-tl) <= node[2] <= (Ymax+tl))):
       addNODE.append(node)
   else:
       deleteNODE.append(node[0])      
       nodes=addNODE
deleteNODE是我稍后在代码中需要的另一个变量


然而,这个迭代的列表非常大。有没有更有效的方法来实现相同的结果?

如评论中所述,Python程序中速度最快且仍然有效的方法是对这种类型的数组使用numpy。在这种情况下,数据被标准化为基础数据INT,并且可以非常高效地查询:

>>> import numpy as np
>>> nodes=np.array([[0,1,1],[1,1,2],[2,2,3],[3,2,5]])
>>> nodes[nodes[:,1]>=2]
array([[2, 2, 3],
       [3, 2, 5]])
>>> nodes[nodes[:,1]<2]
array([[0, 1, 1],
       [1, 1, 2]])

>>> nodes[(nodes[:,1]>=2) & (nodes[:,2]>3)]
array([[3, 2, 5]])

有了你问题中的更多信息,我可以改进我的numpy示例。在这里,我用于选择满足条件的列表视图。它可以很容易地修改为您的示例。

例如,其中的所有坐标{0这意味着什么?除了i之外,节点和坐标有顺序吗?你可以使用吗?除此之外-最大的建议可能就是使用numpy。顺便说一句,你可以控制节点的数据结构吗?你可以使用元组而不是节点的列表来节省大量空间。或者使用命名元组来生成代码更具可读性。下一个要问的问题是,这真的会太慢,还是您试图过早地优化它?Ymin是什么?我不完全理解您的标准,可能是因为打字错误,我也不理解您的实现,因为它不是complete@Dan对不起,错别字,更正了。我已经解决了这个问题lem使用numpy,它将时间从几个小时缩短到了几分钟。非常感谢您的回答,很抱歉输入错误。我已经成功地使用numpy实现了这一点:nodes=np.arraynodes mask=x1处理您使用numpy的实际问题,并返回具体问题。我看不出您真正在问什么g如果你的评论中有任何内容。
>>> import numpy as np
>>> nodes=np.array([[0,1,1],[1,1,2],[2,2,3],[3,2,5]])
>>> nodes[nodes[:,1]>=2]
array([[2, 2, 3],
       [3, 2, 5]])
>>> nodes[nodes[:,1]<2]
array([[0, 1, 1],
       [1, 1, 2]])

>>> nodes[(nodes[:,1]>=2) & (nodes[:,2]>3)]
array([[3, 2, 5]])