微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将映射数据转换为字典,其中每个 XY 坐标都包含一个光谱?

如何解决如何将映射数据转换为字典,其中每个 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=1pandas.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.transformnumpy.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 举报,一经查实,本站将立刻删除。