在Python(IMS snowcover)中对来自大数据集的二维纬度、经度和数据进行子集
我心中有一个“简单”的目标,结果证明很难实现。我有三个二维数组在Python(IMS snowcover)中对来自大数据集的二维纬度、经度和数据进行子集,python,arrays,numpy,matplotlib-basemap,Python,Arrays,Numpy,Matplotlib Basemap,我心中有一个“简单”的目标,结果证明很难实现。我有三个二维数组lat,lon和data,都有维度(2457624576)。前两个是变量data的纬度和经度坐标,我试图在地图上绘制它。我从二进制文件和文本文件的组合中读取所有这些数据,因此任何预处理操作实际上都是不可能的,需要在Python脚本中完成 考虑到阵列的维数,由于内存限制,即使在全球的一个小区域上选择一个基线图投影,也几乎不可能直接绘制数据。我已经试过了,在尝试使用basemap.contourf绘图时出现内存错误 因此,我需要在将数组传
lat
,lon
和data
,都有维度(2457624576)。前两个是变量data
的纬度和经度坐标,我试图在地图上绘制它。我从二进制文件和文本文件的组合中读取所有这些数据,因此任何预处理操作实际上都是不可能的,需要在Python脚本中完成
考虑到阵列的维数,由于内存限制,即使在全球的一个小区域上选择一个基线图投影,也几乎不可能直接绘制数据。我已经试过了,在尝试使用basemap.contourf
绘图时出现内存错误
因此,我需要在将数组传递给轮廓函数之前对其进行子集划分。我试过很多东西,但似乎都不管用。我的想法是这样做
lat_bnds, lon_bnds = [35, 50], [5, 20]
condition=((lats > lat_bnds[0]) & (lats < lat_bnds[1])) & (lons > lon_bnds[0]) & (lons < lon_bnds[1])
我不知道你是如何得到一个形状的数组,但是考虑到如果你想要一个原始数组的子集并且你有你的条件,你可以从原始列表中切片。
a = np.random.randint(10,50, size=(50,2)) # ---- generate coordinates
array([[44, 11],
[40, 36],
[19, 26],
...,
[33, 26],
[42, 12],
[15, 25]])
lats = a[:, 1] # ---- latitude is Y-axis
lons = a[:, 0] # ---- longitude is X-axis
lat_bnds, lon_bnds = [35, 50], [5, 20] # ---- your desired bounds
condition =((lats > lat_bnds[0]) & (lats < lat_bnds[1])) &
(lons > lon_bnds[0]) & (lons < lon_bnds[1])
condition
array([False, False, False, ..., False, False, False], dtype=bool)
condition.shape # => (50,)
a[condition] # ---- slice the original array
array([[11, 45],
[15, 40],
[15, 43],
[15, 49]])
a=np.random.randint(10,50,size=(50,2))#----生成坐标
数组([[44,11],
[40, 36],
[19, 26],
...,
[33, 26],
[42, 12],
[15, 25]])
纬度=a[:,1]#----纬度是Y轴
lons=a[:,0]#----经度是X轴
lat_bnds,lon_bnds=[35,50],[5,20]——您想要的边界
条件=((纬度>纬度[0])和(纬度<纬度[1])和
(lons>lon_bnds[0])和(lons(50,)
a[条件]#----对原始数组进行切片
数组([[11,45],
[15, 40],
[15, 43],
[15, 49]])
希望能让你进入你想去的方向。
< p>我不知道你是如何得到一个那个形状的数组,但是考虑到如果你想要一个原始数组的子集并且你有你的条件,你可以从原始列表中切片。a = np.random.randint(10,50, size=(50,2)) # ---- generate coordinates
array([[44, 11],
[40, 36],
[19, 26],
...,
[33, 26],
[42, 12],
[15, 25]])
lats = a[:, 1] # ---- latitude is Y-axis
lons = a[:, 0] # ---- longitude is X-axis
lat_bnds, lon_bnds = [35, 50], [5, 20] # ---- your desired bounds
condition =((lats > lat_bnds[0]) & (lats < lat_bnds[1])) &
(lons > lon_bnds[0]) & (lons < lon_bnds[1])
condition
array([False, False, False, ..., False, False, False], dtype=bool)
condition.shape # => (50,)
a[condition] # ---- slice the original array
array([[11, 45],
[15, 40],
[15, 43],
[15, 49]])
a=np.random.randint(10,50,size=(50,2))#----生成坐标
数组([[44,11],
[40, 36],
[19, 26],
...,
[33, 26],
[42, 12],
[15, 25]])
纬度=a[:,1]#----纬度是Y轴
lons=a[:,0]#----经度是X轴
lat_bnds,lon_bnds=[35,50],[5,20]——您想要的边界
条件=((纬度>纬度[0])和(纬度<纬度[1])和
(lons>lon_bnds[0])和(lons(50,)
a[条件]#----对原始数组进行切片
数组([[11,45],
[15, 40],
[15, 43],
[15, 49]])
希望这能帮你找到你想要的方向。如果有人在试图用Python绘制IMS 1-km分辨率数据时看到这篇文章,我有一个穷人解决方案,它可以很好地工作 内存错误由绘图例程引发,但数组仍然可以存储到python中。因此,我没有使用where函数进行子集设置,而是尝试使用显式索引,如
lat_subset=lat[imin:imax, jmin:jmax]
然后使用plot.imshow()打印结果,而不进行等高线打印或使用地图投影来了解数据的外观。这让我能够选择我感兴趣的区域所在的指数范围。现在,我能够在没有内存错误的情况下绘制等高线图
我有一个带笔记本的小存储库,上面显示了如何绘制这些数据:。
它的优点是可以直接在线读取文件,尽管考虑到坐标文件的大小,仍然需要下载它们 如果有人在试图用Python绘制IMS 1-km分辨率数据时遇到这篇文章,我有一个穷人解决方案,它可以很好地工作 内存错误由绘图例程引发,但数组仍然可以存储到python中。因此,我没有使用where函数进行子集设置,而是尝试使用显式索引,如
lat_subset=lat[imin:imax, jmin:jmax]
然后使用plot.imshow()打印结果,而不进行等高线打印或使用地图投影来了解数据的外观。这让我能够选择我感兴趣的区域所在的指数范围。现在,我能够在没有内存错误的情况下绘制等高线图
我有一个带笔记本的小存储库,上面显示了如何绘制这些数据:。
它的优点是可以直接在线读取文件,尽管考虑到坐标文件的大小,仍然需要下载它们 嘿,谢谢你考虑这个问题,但不幸的是,这没有帮助。我希望事情能这么简单:(.纬度和经度是原始极赤平投影上的二维阵列,因此简单地对它们进行切片不会有任何好处。需要检查条件为真的每个网格点,并相应地对阵列进行子集划分。我在文章中添加了一些额外的信息,可能有助于再现问题。是的,sample数据会很有用。如果将点投影到立体投影中,您可能希望在同一投影中报告边界框坐标嘿,感谢您研究了这个问题,但不幸的是,这没有帮助。我希望它能这么简单:(.纬度和经度是原始极赤平投影上的二维阵列,因此简单地对它们进行切片不会有任何好处。需要检查条件为真的每个网格点,并相应地对阵列进行子集划分。我在文章中添加了一些额外的信息,可能有助于再现问题。是的,sampl如果这些点被投影到立体投影中,你可能希望报告边界框坐标