将3D numpy阵列合并到Pandas数据帧+1D向量中

2024-09-28 23:18:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集,它是一个具有形状(1536x16x48)的numpy数组。对这些维度的快速解释可能会有所帮助:

  • 数据集由EEG传感器以256Hz的频率收集的数据组成(1秒=256个测量值/值)
  • 1536个值代表6秒的EEG数据(256*6=1536)
  • 16是用于收集数据的电极数量
  • 48是样本数

总结:我有48个6秒(1536个值)的脑电图数据样本,由16个电极采集

我需要用所有这些数据创建一个pandas数据框,从而将这个3D数组转换成2D。如果我将所有样本一个叠在另一个上面,则可以删除深度维度(48)。因此,新数据集的形状将为(1536*48)x16

除此之外,因为这是一个分类问题,我有一个48个值的向量,代表每个EEG样本的类别。新数据集还应该将其作为“类”列,然后实际形状将是:(1536*48)x16+1(类)

我可以很容易地通过3D数组的深度维度循环,并将所有内容连接到一个2D新数组中。但这看起来很糟糕,因为我将处理许多像这样的数据集。性能是一个问题。我想知道有没有更聪明的方法

我试图为这个问题提供尽可能多的信息,但由于这不是一项琐碎的任务,如果需要,请随时询问更多细节

提前谢谢


Tags: 数据numpy数量代表传感器数组电极频率
2条回答

对于numpy部分

x = np.random.random((1536, 16, 48)) # ndarray with simillar shape
x = x.swapaxes(1,2) # swap axes 1 and 2 i.e 16 and 48
x = x.reshape((-1, 16), order='C') # order is important, you may want to check the docs
c = np.zeros((x.shape[0], 1)) # class column, shape=(73728, 1)
x = np.hstack((x, c)) # final dataset
x.shape

输出

(73728, 17)

还是一行

x = np.hstack((x.swapaxes(1,2).reshape((-1, 16), order='C'), c))

最后,

x = pd.DataFrame(x)

设置

>>> import numpy as np
>>> import pandas as pd
>>> a = np.zeros((4,3,3),dtype=int) + [0,1,2]
>>> a *= 10
>>> a += np.array([1,2,3,4])[:,None,None]
>>> a
array([[[ 1, 11, 21],
        [ 1, 11, 21],
        [ 1, 11, 21]],

       [[ 2, 12, 22],
        [ 2, 12, 22],
        [ 2, 12, 22]],

       [[ 3, 13, 23],
        [ 3, 13, 23],
        [ 3, 13, 23]],

       [[ 4, 14, 24],
        [ 4, 14, 24],
        [ 4, 14, 24]]])

沿最后一个尺寸均匀分割;堆叠那些元素,重塑形状,馈送到DataFrame。使用阵列维度的长度可以简化该过程

>>> d0,d1,d2 = a.shape
>>> pd.DataFrame(np.stack(np.dsplit(a,d2)).reshape(d0*d2,d1))
     0   1   2
0    1   1   1
1    2   2   2
2    3   3   3
3    4   4   4
4   11  11  11
5   12  12  12
6   13  13  13
7   14  14  14
8   21  21  21
9   22  22  22
10  23  23  23
11  24  24  24
>>>

使用你的形状

>>> b = np.random.random((1536, 16, 48))
>>> d0,d1,d2 = b.shape
>>> df = pd.DataFrame(np.stack(np.dsplit(b,d2)).reshape(d0*d2,d1))
>>> df.shape
(73728, 16)
>>>

从3d数组生成数据帧后,将分类列添加到其中,df['class'] = dataColumn selection, addition, deletion

相关问题 更多 >