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

嵌套 numpy 数组与多索引,哪种 Python 数据结构和包似乎最适合?

如何解决嵌套 numpy 数组与多索引,哪种 Python 数据结构和包似乎最适合?

我绞尽脑汁已经有一段时间了,但我在弄清楚哪个 python 包实际上似乎能够以相对优化的方式完成我需要的事情时遇到了问题。

我正在尝试处理大量较小的数据集,并且需要能够将它们处理成包含这些数据集的各种组合的各种绘图,并对单个数据集进行少量处理。

数据就是你所说的多维数据。不过,其中一些维度本质上是单一值。

解释我的数据。这是光谱数据。我有许多设备(一维),我测量了作为波长函数的计数。所以数据是两列(波长,计数),每一行是一个波长和一个计数。我可以处理这些数据以添加基线以及基线和计数数据(二维)之间的差异。有一些元数据可以忽略。 对于每个设备,我都在不同条件、不同功率、不同温度等(至少另外 1 个维度?)下获取了这些光谱数据。

每个光谱都在不同的文件中。有100个设备,我可以在每个设备上做20个电源配置。我可能会在特定功率下进行一些温度配置,但不是所有功率。对于不同的设备,电源配置不会相同。某些光谱在光谱仪上的中心波长与设备上的其他光谱不同。这里我想说的唯一可以保证的就是处理后的光谱文件(1024,2)或(1024,4)的尺寸。

每个文件名都包含与数据集配置相关的附加信息,我将在导入数据时对其进行解析。

我可能如何处理数据。 我对数据的处理围绕着针对各种配置(功率、温度等)的计数率绘制波长。数据具有我将检测到的峰值。我可能希望根据配置(功率、温度)等绘制某些波长的计数率。通常,我一次只想绘制一个设备,但由于我正在处理的文件数量众多,我希望能够一次性摄取数据,进行相应的通用处理并制作绘图。而且我无法每次都手动定义结构和数据。

我曾尝试使用 numpy、pandas 和 xarray,但我想知道它们中的任何一个是否可以有效地处理数据(至少在当前格式下)。

我可以将一个包含光谱数据的 numpy 数组嵌套在另一个包含设备、功率和温度信息的 numpy 数组中。除了可能有点麻烦之外,这基本上是我迄今为止一直在做的事情。因此,该阵列看起来像(设备、功率、温度、光谱),其中光谱将是另一个 numpy 阵列(波长、光谱、基线、差异)。

我研究过使用熊猫(我不熟悉熊猫),从我的阅读来看,似乎表明嵌套(虽然可能 Pandas: Nesting Dataframes)不是一个好主意 Pandas: Storing a DataFrame object inside another DataFrame i.e. nested DataFrame,我应该使用多索引。但是,通过查看熊猫的教程 https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html,我不能完全理解如何根据我拥有的数据构建多索引。我不确定单个对象是否可以容纳所有数据。

这是我正在尝试的东西。基本上,该函数读取具有不同功率的单个设备的光谱 csv 文件列表。将附加配置信息添加到每一行,然后使用 concat 函数将两个结果连接到单个数据帧并转换为多索引。

powers = [53,62]    
def importspectra(spectrafile):
    frames = []
    for n in range(0,len(spectrafiles)):
        data = pd.read_csv(spectrafile[n],names=["wavelength","counts"],skiprows=37)
        data['device']="R2C7"
        data['power']=powers[n]
        frames.append(data)
    frames = pd.concat(frames)
    return pd.MultiIndex.from_frame(frames)

现在我想我应该能够对数据的子集进行排序或选择,例如 df['R2C7']。

data
Out[4]: 
MultiIndex([(900.45203,2,'R2C7',53),(900.52997,6,(900.60785,5,(900.68579,(900.76367,4,(900.84161,(900.91949,(900.99738,16,(901.07532,18,( 901.1532,14,...
            (978.35303,119,62),(978.42871,127,(978.50433,125,(978.57996,102,(978.65552,(978.73114,121,(978.80676,124,(978.88239,145,(978.95801,188,(979.03363,123,62)],names=['wavelength','counts','device','power'],length=2048)
data["R2C7"]
Traceback (most recent call last):
  File "C:\Users\corih\.conda\envs\py39\lib\site-packages\IPython\core\interactiveshell.py",line 3437,in run_code
    exec(code_obj,self.user_global_ns,self.user_ns)
  File "<ipython-input-5-4342b05204a9>",line 1,in <module>
    data["R2C7"]
  File "C:\Users\corih\.conda\envs\py39\lib\site-packages\pandas\core\indexes\multi.py",line 2028,in __getitem__
    if level_codes[key] == -1:
IndexError: only integers,slices (`:`),ellipsis (`...`),numpy.newaxis (`None`) and integer or boolean arrays are valid indices

但显然这行不通..

此外,我已经考虑过使用 xarray(同样,我不熟悉)并且我遇到了与 Pandas 类似的问题。我不确定如何从我拥有的数据构造一个 xarray 对象。

有没有更好的方法来做到这一点?还是我在高维数组上浪费时间

任何建议将不胜感激。

解决方法

不确定我是否正确理解问题,但 data["R2C7"] 将不起作用,因为您将列命名为“设备”。如果您想获取使用设备“R2C7”的所有行,您需要编写以下内容:

print(data.loc[data['device'] == 'R2C7'])

Here a link to an other post 这里有详细解释。

我认为熊猫会为您解决问题。继续努力吧。它变得更容易了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。