快速查找值而不是遍历列表列表的方法?

2024-06-26 11:07:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我会先解释情况而不是问问题,因为有人可能知道一个更好的方法让我跟踪我的数据。你知道吗

总的问题是,我想使用一个由许多图像组成的控制网络。这些图像横穿行星表面,有些重叠。点存在于给定的纬度x经度。度量是不同图像上这些点的实例。每个点必须至少有2个度量值(否则会在其他软件中抛出)。每个度量值都有许多需要存储的信息(它所在的图像、度量值所在的行/列,等等)。在其他软件中,控制网络已经制作好了,我要做的是编写python代码,用它做很多其他软件没有做的事情。你知道吗

我已经解析了控制网络文件,并将其读入一个Python列表列表,这可能是不雅的,所以如果有人有更好的方法来做到这一点,我洗耳恭听。下面是列表[]的示例:

[
 [[PointID_1, ImageSN_A, line, sample, goodness-of-fit],
  [PointID_1, ImageSN_B, line, sample, goodness-of-fit]]
 [[PointID_2, ImageSN_A, line, sample, goodness-of-fit],
  [PointID_2, ImageSN_B, line, sample, goodness-of-fit]]
]

PointID_1和\u 2将位于不同的位置。你知道吗

我还有一个列表,它实际上是ImageSN的缓存,这样我就可以轻松地解析并知道控制网络中有哪些图像。你知道吗

我有一个列表,它是PointID的缓存,我称之为“行”(把它想象成一个电子表格)对应于ImageSN列表中该行的索引,所以我可以很容易地找出每个图像上的PointID。你知道吗

现在我要快速解决的问题是:我要计算一个矩形壳比,它是图像上点的面积除以图像的面积。理论上,我的方法是遍历每个图像上的点,找到该点的度量值,得到线/样本,并将其与四个变量(最小/最大线/样本)进行比较。所以,只需浏览列表,找出每个图像上最外层的度量值,并计算出它们的面积与图像的面积之比。你知道吗

这是我的代码

for i in range(0,len(PointIDs)):
    for sublist_cnet_point in CNet:
        for sublist_cnet_measure in sublist_cnet_point:
            if image in sublist_cnet_measure[1]:
                min_line = min(min_line,sublist_cnet_measure[3])
                min_samp = min(min_samp,sublist_cnet_measure[2])
                max_line = max(max_line,sublist_cnet_measure[3])
                max_samp = max(max_samp,sublist_cnet_measure[2])

这很简单。但是,这需要很长时间,我正在一个相对较小的控制网络上测试这个功能(30MB,而我要处理的是大于1GB的)。这对应于具有64k控制点的24幅图像,包括183k控制措施。完成所有这些计算的平均时间约为2分钟(4GHz处理器,无RAM问题),但有些计算时间超过20分钟。正如我所说,这大约是我实际网络的1/100。你知道吗

意思是,这是站不住脚的。那么,有没有更快捷的方法?如果不是的话,我能想到的唯一解决方案就是随机抽取一个子集的pointid,并希望它们分布得足够好,这样壳比就足够精确了。我也在考虑多线程,但这并不能解决巨大的扩展问题,除非我使用计算机集群(我没有)。你知道吗


Tags: sample方法图像网络列表度量linemin