【问题标题】:How can I quickly filter a large dataset?如何快速过滤大型数据集?
【发布时间】:2016-10-16 19:12:29
【问题描述】:

我有一个包含全球纬度和经度的大型数据集。但是,我只对查看特定区域感兴趣,因此我想过滤掉该区域之外的所有纬度/经度。问题是我使用 if 语句来解析数据,但是,这需要很长时间。有没有更快的方法来实现这一点?

数据来自 netCDF 文件,可以存储在字典中。我只想要北纬 10 度和北纬 80 度之间的纬度,以及 -170 度和 -50 度之间的经度。到目前为止,这是我尝试过的:

ret_dict = {}
with Dataset(filename,'r') as fid:
    ret_dict['time'] = fid.variables['timeObs'][:]
    sort_order = np.argsort(ret_dict['time'])
    lat1 = [i for i in fid.variables['latitude'][:][sort_order] if fid.variables['latitude'][:][sort_order] > 10 ]
    lat2 = [i for i in lat1 if lat1 < 80]

上面的代码可以重复经度。但是,这对于我的大量数据来说太慢了。它也没有给我索引,所以我确保我保留了原始的纬度和经度对。如何快速截断所有变量的数据?

编辑:下面的答案对于问题的第一部分是正确的,但是我也在尝试使用过滤纬度的索引截断其他变量。我正在尝试:

lon = [j for i,(j,i) in zip(fid.variables['longitude'][:],fid.variables['longitude']) if 10<i<80]

但是我收到错误:***TypeError: 'numpy.float32' object is not iterable

【问题讨论】:

标签: python numpy


【解决方案1】:

您是否有任何理由需要对数据进行排序?排序是一项昂贵的操作O(nlogn),而过滤只是O(n)。如果排序不是必需的,您可以使用 1 个过滤操作来执行此操作。 (记住,我不知道你的数据,所以你可能需要稍微修改一下)

lat = [i for i in fid.variables['latitude'][:] if 10 < i < 80 ]

在提供的信息有限的情况下,这是我能想到的最快方法。如果这仍然太长,请提供更多信息,以便我们可以尝试为您提供更多帮助:)

已编辑

【讨论】:

  • 我收到错误:****ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()。我正在对数据进行排序,以便纬度/经度对保持在一起。这没有必要吗?
  • 我犯了一个草率的错误并进行了编辑以修复它。对不起。此外,您很可能不需要排序以使这些对保持在一起。您可以自行验证。
  • 我进行了编辑以进一步澄清我的问题的第二部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2016-12-30
相关资源
最近更新 更多