【问题标题】:python - Numpy point to gridpython - Numpy 指向网格
【发布时间】:2017-10-04 12:46:38
【问题描述】:

我有一个经度/纬度数据集,如下所示:

id,spp,lon,lat
1a,sp1,1,9
1b,sp1,3,11
1c,sp1,6,12
2a,sp2,1,9
2b,sp2,1,10
2c,sp2,3,10
2d,sp2,4,11
2e,sp2,5,12
2f,sp2,6,12
3a,sp3,4,13
3b,sp3,5,11
3c,sp3,8,8
4a,sp4,4,12
4b,sp4,6,11
4c,sp4,7,8
5a,sp5,8,8
5b,sp5,7,6
5c,sp5,8,2
6a,sp6,8,8
6b,sp6,7,5
6c,sp6,8,3

根据这些数据,我想生成一个这样的网格:

0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 0 0 0 0 0 
0 0 0 0 0 0 1 1 2 0 0 0 0 
0 0 0 0 0 1 1 1 1 0 0 0 0 
0 0 0 1 0 1 0 0 0 0 0 0 0 
0 0 0 2 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 1 3 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 1 0 0 
0 0 0 0 0 0 0 0 0 0 1 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0

它使用变量“spp”作为分类(分组)因子,给出网格每个单元格中的数据记录数。

从这个网格中,我想创建一个热图,叠加在一张地理地图上,这样我就得到了如下图所示的结果。

我可以看到how to plot a heatmap on a Matplotlib/Basemap,但我不知道如何从点数据生成网格。此外,重要的是我能够选择网格大小,以便可以评估几种不同的分辨率。我想我想要的可以通过 Numpy meshgrid 或 Scipy griddata 来实现,但我无法进一步了解如何使用它们。

任何提示、想法、建议将不胜感激。

【问题讨论】:

  • 这是一个需求转储,而不是一个特定的编程问题。 SO只适用于后者。前者要花钱。请尝试自行解决此问题,当您对无法开始工作的一段代码有特定问题时,请联系 SO。
  • 无法真正理解这种苛刻的意义。有很多个问题没有“一段不起作用的代码”——而且他们都得到了礼貌的回答。就我自己而言,这些年来我问了很多提供代码的问题,但是这一次我什至无法设计出任何可行的东西,所以添加三四个是毫无意义的,如果不是嘲笑的话代码行只是为了假设我做了一些事情。无论如何,我不是要一个“现成的答案”,只是为了一些提示和技巧。但我相信其他更有礼貌的 SO 用户会提供有用的建议。祝你好运!
  • 问题更多的是这里没有真正的问题描述。这确实是一项任务。我不会说您通常需要提供任何代码,但提供问题描述的逻辑通常会自动导致代码问题。如果您坚持How to Ask,则需要通过说明您尝试解决任务的内容来明确问题。这将带你到像网格网格这样的东西。现在如果你说你不了解它们,那就太笼统了,所以你需要尝试使用它们。这将导致代码,并且问题中将需要该代码。
  • 注意一个重要的区别。如果有人要求以前从未被要求过的东西,那么实际问题就很清楚了,因为还没有任何答案。在这种情况下,人们很乐意提供答案,因为对很多人来说知道如何解决这个任务很有用。这些是您在寻找解决方案时通常会遇到的问题。你在这里问的只是网格坐标的一般问题的一个非常特殊的情况。顺便说一下,它独立于 matplotlib 或可视化。所以你不能指望有人来做你的任务。
  • 那些cmets的想法通常是为了帮助你写一个更好的问题,可以回答。从我们这边来看,确实有很大一部分理想主义,试图只对 SO 提出好的和有用的问题。为此目的还有其他机制,即以“过于宽泛”或“离题”的方式结束问题。最终,审查队列将决定其信仰。最后一句话:不要把这些看成个人的,不要带着情绪去看待它。如果您对任何事情有疑问或想听到不同的意见,您可以在Meta Stack Overflow提问。

标签: python numpy matplotlib


【解决方案1】:

如果你愿意使用 pandas,你可以这样做

dims = max(df[['lat','lon']].max())
df.groupby(['lat','lon'])['lat'].count().unstack().reindex(range(1,dims+1)).T.reindex(range(1,dims+1)).fillna(0).T

生成方形数据框

lon   1    2    3    4    5    6    7    8    9    10   11   12   13
lat                                                                 
1    0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
2    0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0
3    0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0
4    0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
5    0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0
6    0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0
7    0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
8    0.0  0.0  0.0  0.0  0.0  0.0  1.0  3.0  0.0  0.0  0.0  0.0  0.0
9    2.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
10   1.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
11   0.0  0.0  1.0  1.0  1.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
12   0.0  0.0  0.0  1.0  1.0  2.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
13   0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0

您总是可以使用df.values 将 by 转换为 numpy

【讨论】:

  • 终于有一个直接的答案!非常感谢@djk47463!我不反对熊猫,虽然我不是很习惯。您的答案似乎有效,我将尝试使用其他数据。 gis.stackexchange.com 的用户也提供了一个有用的答案(没有熊猫,因此比你的更长更复杂;我目前也在研究它)。 非常感谢您的帮助 正如您清楚地表明的那样,问答网站中的严厉和诽谤不会导致任何地方。祝你好运!
  • @maurobio,没问题,很高兴帮助您朝着正确的方向前进!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 2015-06-24
  • 1970-01-01
  • 2023-03-29
  • 2019-05-19
  • 2010-12-22
相关资源
最近更新 更多