【问题标题】:Best data structure to use in python to store a 3 dimensional cube of named data在 python 中用于存储命名数据的 3 维立方体的最佳数据结构
【发布时间】:2015-11-24 03:36:57
【问题描述】:

我想要一些关于我选择的数据结构的反馈。我有一个特定电压值的 2D X-Y 电流值网格。我有几个电压阶跃,并将数据组织成 X-Y-Voltage 的立方体。我在这里说明了坐标轴:http://imgur.com/FVbluwB

我目前在 python 字典中使用 numpy 数组来处理我正在扫描的不同类型的晶体管。我不确定这是否是最好的方法。我看过 Pandas,但也不确定这对 Pandas 来说是否是一份好工作。希望有人可以帮助我,所以我可以学习成为pythonic!生成一些测试数据的代码和最终结构如下。

谢谢!

import numpy as np

#make test data

test__transistor_data0 = {"SNMOS":np.random.randn(3,256,256),"SPMOS":np.random.randn(4,256,256), "WPMOS":np.random.randn(6,256,256),"WNMOS":np.random.randn(6,256,256)}
test__transistor_data1 = {"SNMOS":np.random.randn(3,256,256), "SPMOS":np.random.randn(4,256,256), "WPMOS":np.random.randn(6,256,256), "WNMOS":np.random.randn(6,256,256)}
test__transistor_data2 = {"SNMOS":np.random.randn(3,256,256), "SPMOS":np.random.randn(4,256,256), "WPMOS":np.random.randn(6,256,256), "WNMOS":np.random.randn(6,256,256)}
test__transistor_data3 = {"SNMOS":np.random.randn(3,256,256), "SPMOS":np.random.randn(4,256,256), "WPMOS":np.random.randn(6,256,256), "WNMOS":np.random.randn(6,256,256)}


quadrant_data = {"ne":test__transistor_data0,"nw":test__transistor_data1,"sw":test__transistor_data2,"se":test__transistor_data3} 

【问题讨论】:

  • 你为什么使用dict?我猜一个简单的 numpy 3D 数组可以正常工作。
  • 我认为该结构没有问题。它又好又干净, pythonic。在不了解您的实施的情况下,很难给出更具体的指导。你可以看看numpy.recarray,但我也不确定这就是你想要的。
  • 次要:您的quadrant_data 行不太可能是正确的,您复制了键“se”,而缺少“nw”。
  • 数据结构非常依赖于实现.. 没有关于您将如何访问数据以及您将对其进行何种操作的进一步细节,很难说。正如@Zdar 指出的那样,您可以向 numpy 数组添加一个额外的维度,而不是创建字典。
  • 哎呀我确实复制了 se。谢谢你抓住那个。数据集是芯片上晶体管网格的 IV 扫描。我的实现是这个数据集内部存储在一个芯片对象中,这样我就可以对数据进行统计分析。我有多个版本的芯片,我认为如果它们可以是对象并处理各自的数据会很方便。

标签: python numpy pandas data-structures data-analysis


【解决方案1】:

xarray 可能值得一试,它类似于(部分基于)pandas,但专为 N 维数据设计。

它的两个基本容器是一个DataArray,它是一个标记的ND数组,一个Dataset,它是一个DataArrays的容器。

In [29]: s1 = xray.DataArray(np.random.randn(3,256,256), dims=['voltage', 'x', 'y'])

In [30]: s2 = xray.DataArray(np.random.randn(3,256,256), dims=['voltage', 'x', 'y'])

In [32]: ds = xray.Dataset({'SNMOS': s1, 'SPMOS': s2})

In [33]: ds
Out[33]: 
<xray.Dataset>
Dimensions:  (voltage: 3, x: 256, y: 256)
Coordinates:
  * voltage  (voltage) int64 0 1 2
  * x        (x) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
  * y        (y) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
Data variables:
    SPMOS    (voltage, x, y) float64 -1.363 2.446 0.3585 -0.8243 -0.814 ...
    SNMOS    (voltage, x, y) float64 1.07 2.327 -1.435 0.4011 0.2379 2.07 ...

两个容器都有很多不错的功能(请参阅文档),例如,如果您想知道在第一个电压级别上每个晶体管的 x 的最大值,它会是这样的:

In [39]: ds.sel(voltage=0).max(dim='x').max()
Out[39]: 
<xray.Dataset>
Dimensions:  ()
Coordinates:
    *empty*
Data variables:
    SPMOS    float64 4.175
    SNMOS    float64 4.302

【讨论】:

  • 这看起来很酷。谢谢!我的问题很模糊,因为我不确定自己想要什么,但是标记数据不同轴的能力非常有用。
  • 链接已失效,以及项目的旧名称。它现在被称为 xarray 可以在这里找到:xarray.pydata.org/en/stable
  • 在我的辩护中,这是 2 年前的事了 :) - 感谢您的评论,编辑了名称/链接。
猜你喜欢
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
相关资源
最近更新 更多