np.ndarray是否具有携带轴标签的功能?
假设我有一个二维数组,其维度是时间和速度。我想实际上将两个轴标签(时间和速度值)嵌入到一个对象中,这样只要我对数组进行操作(例如切片或偶数图),对象就会处理轴。
经过一段时间的搜索,我找不到任何东西。我本来就要开始自己编写这样一个课程,然后我想在这里问一下,以防万一我错过了什么。
由于
鉴于到目前为止的评论和答案,我认为我没有解释清楚自己,或者仅仅因为一个过于简单的例子[时间,速度]而无法理解我想要的原因。
在我工作的领域,通常有来自多个传感器的录音,然后对数据进行分段,以便您有多个样本/事件。如果每个传感器跨时间捕获一维信号,则其中一个具有维度[传感器,事件,时间](维度隐含在数据本身中)。
当使用纯numpy.ndarray时,你最终会得到变量:data
,一个包含记录数据的三维数组; sensor
,1-D np.recarray,包含每个传感器的所有信息(例如姓名,位置......); event
,1-D np.recarray,包含每个样本/事件的所有信息(例如类型,偏移,......);和时间,一个带有时间值的向量。
我想要的是将所有信息都放在一个对象mydata
中,而不要担心基本的操作(切片)。因此mydata[0:3, 1:10]
会相应地对相应的维度进行切片。
我同意绘图之类的内容将是特定于数据的,但我很乐意使用一些额外的函数(例如plot
)编写此类对象的子类。
可读性:比较
data1 = data[0:3, 1:10]
sensor1 = sensor[0:3]
event1 = event[1:10]
time1 = time
用简单的
mydata1 = mydata[0:3, 1:10]
维护:第二个选项显然更容易维护,并且在正确切割所有关联变量时不容易出错。
便利性:将所有这些信息放在同一个地方可以在课堂中集成有用且功能强大的功能。例如,如果我为时间序列创建派生类(强制使用时间轴),我可以运行特定于时间的函数,而无需指定时间或采样频率(因为此信息在对象本身内)。我们的想法是拥有一个带有轴标签的基类,并且必要时会自然产生特定的子类(例如,一个用于时间序列,一个用于视频,一个用于地形信息等),其中包含专门的功能。
正如@ user2357112所提到的,Pandas的DataFrame接近我正在寻找的东西。但是,除了N-D阵列仍然是实验性的事实之外,它似乎过于面向类似于表格的行为(对于我迄今为止所阅读的内容),例如,处理第一个维度的方式与其他维度不同(项目与列)。
以上看起来似乎微不足道,不值得付出努力,但几年前我编写了一个np.ndarray的子类,具有这样的功能,我可以向你保证,它让我的生活和代码变得更加容易! (具体应用类似于上面的例子[传感器,样品,时间])。但是当我学习python的时候又回来了,我编写它的方式并不是你所说的漂亮。它也有一些基本的错误,比如轴标签不遵循与np.ndarray相同的共享内存规则。
在着手重写这件事并将其公之于众之前,我想知道那里是否有类似的东西。
答案 0 :(得分:6)
这实际上是您可能一直在寻找的内容:http://xarray.pydata.org/en/stable/index.html
答案 1 :(得分:1)
numpy
数组是可用于构建标记表和图的抽象对象。 pandas
将表格和数据系列角度matplotlib
推到绘图角度。对于大规模数据存储,例如由超级计算机模型生成,有像NETCDF和HDF5这样的系统。
您可能希望了解HDF5如何处理维度比例,以及h5py
如何让您在numpy
中访问它们。
http://docs.h5py.org/en/latest/high/dims.html
数据集是多维数组。 HDF5支持标注尺寸并将一个或“尺寸比例”与每个尺寸相关联。维度标度只是另一个HDF5数据集。
从轴创建数组是一项常见的numpy
任务。 np.arange
和np.linspace
创建1d数组,np.meshgrid
,mgrid
和ogrid
创建2d(或更大)数组,这些数组又用于计算数值网格。请注意,meshgrid
允许您指定ij
或xy
个样式,反映两个约定,行/列v绘制水平/垂直轴。
X, Y = np.meshgrid(x,y)
z = my_function(X,Y)
但绘图功能可以采取各种形式的输入:
plot(x, y, z) # 2 1d arrays and a 2d
scatter(X,Y,Z) # 3 2d arrays
scatter(XYZ) # 1 Nx3 array
因此,虽然这是生成数组和从属数据库之间的连接,但这是一个更高级别的组织,一个代码必须维护的组织,而不是numpy
为您做的事情。
评论提及structured arrays
。这可以用名为columns
(并扩展到更高维度)替换2d数组的fields
,但在处理从CSV文件加载的各种数据时最有用。它们更像是SQL表的字段,而不是绘图的y
坐标。