如何解决如何将映射数据转换为字典,其中每个 XY 坐标都包含一个光谱?
我有一个 2D 地图,其中每个像素都包含一个光谱。我想从这种格式转换数据:
X Y Wave Intensity
-34727.180000 -4204.820000 1.484622 139.193512
-34727.180000 -4204.820000 1.484043 120.991280
-34727.180000 -4204.820000 1.483465 125.905304
-34726.180000 -4204.820000 1.483465 131.262970
-34726.180000 -4204.820000 1.482887 122.784081
-34726.180000 -4204.820000 1.482309 129.853088
-34725.180000 -4204.820000 1.483465 129.655670
-34725.180000 -4204.820000 1.482887 119.567032
-34725.180000 -4204.820000 1.482309 126.097000
-34727.180000 -4203.820000 1.463490 124.331985
-34727.180000 -4203.820000 1.462927 138.189377
-34727.180000 -4203.820000 1.462364 127.824867
到字典,其中键是 X,Y 坐标的元组,值是 3×2 numpy 数组。例如:
DICT = {
(-34727.180000,-4204.820000): [[1.484622,139.193512],[1.484043,120.991280],[1.483465,125.905304]],(-34726.180000,-4204.820000): [[1.482887,122.784081],[1.482887,[1.482309,129.853088]],(-34725.180000,-4204.820000): [[1.483465,129.655670],119.567032],126.097000]],(-34727.180000,-4203.820000): [[1.463490,124.331985],[1.462927,138.189377],138.189377]]}
这个例子是简化的;我的实际地图包含四个以上的像素(X、Y 坐标),每个坐标有 512 个波强度对。我希望解决方案可以从四像素图推广到 400 像素图,每个数组从 3×2 numpy 数组推广到 512×2 numpy 数组。
最终目标是获取每个坐标的波强度对,将它们拟合为高斯分布,找到该分布的(最大)振幅,并绘制每个 X、Y 坐标的最大值。这部分问题不需要包含在解决方案中,但如果有人为这部分问题添加解决方案,那就太好了!
我对不涉及字典的方法(例如 4D numpy 数组)持开放态度,但目前我看不到其他方法。随意推荐一种替代方法。目前,我正在使用 pandas
:
import pandas as pd
IN_PATH = r'PATH_TO_FILE'
FNAME = r'\FILENAME.txt'
data = pd.read_csv(IN_PATH+FNAME,sep='\t',skiprows=1)
data.columns = ["X","Y","Wave","Intensity"]
提前致谢!
解决方法
首先pandas.DataFrame.set_index
坐标,pandas.DataFrame.agg
list
沿axis=1
,pandas.DataFrame.groupby
索引,然后pandas.DataFrame.groupby.agg
列出,并转换{{ 3}}:
>>> df.set_index(['X','Y']).agg(list,1).groupby(level=(0,1)).agg(list).to_dict()
{(-34727.18,-4204.82): [[1.484622,139.193512],[1.484043,120.99128],[1.483465,125.905304]],(-34727.18,-4203.82): [[1.46349,124.331985],[1.462927,138.189377],[1.462364,127.824867]],(-34726.18,-4204.82): [[1.483465,131.26297],[1.482887,122.784081],[1.482309,129.853088]],(-34725.18,129.65567],119.567032],126.097]]}
这将给出list
中的结果,如果你想要数组,你可以pandas.Series.transform
到numpy.array
:
>>> df.set_index(['X',1)).agg(list).transform(np.array).to_dict()
{(-34727.18,-4204.82): array([[ 1.484622,[ 1.484043,120.99128 ],[ 1.483465,125.905304]]),-4203.82): array([[ 1.46349,[ 1.462927,[ 1.462364,127.824867]]),-4204.82): array([[ 1.483465,131.26297 ],[ 1.482887,[ 1.482309,129.853088]]),129.65567 ],126.097 ]])}
,
您可以简单地遍历数据帧。但请注意,在您的示例数据中,前几个条目具有相同的 X 和 Y,因此字典条目将被覆盖。
d = {}
for ix,row in df.iterrows():
d[(row['X'],row['Y'])] = [row[a] for a in row.keys() if not a=='X' and not a=='Y']
编辑: 将一个像素的所有数据存储在同一个键下:
d = {}
for ix,row in df.iterrows():
entry = [row[a] for a in row.keys() if not a=='X' and not a=='Y']
x,y = row['X'],row['Y']
if d.get((x,y)):
d[(x,y)] += [entry]
else:
d[(x,y)] = [entry]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。