如果我有一个数据框显示为:

    x y z t1 t2 t3 t4 t5 ...
c1  1 2 3 15 98 36 45 24
c2  2 ...
c3  3 ...
c4  4 ...
c5  5 ...
c6  6 ...
.
.
.


本质上,每行是不同的坐标,每列是时间序列中的一个点,并且每个条目(c_i,t_j)都是某种度量。我想要做的是将其放入一种4D张量(我希望这是正确的术语),其中尺寸为(x,y,z,t),因此每个条目都是一个3D numpy ndarray,每个术语作为相应的(c,t)度量。

这是我目前拥有的:

tensor = []

for i in range(len(list(df.columns)) - 3):
    tensor.append(np.zeros((max_x - min_x + 1, max_y - min_y + 1, max_z - min_z + 1)))
    for j in range(len(df["x"])):
        tensor[i][df["x"][j] - min_x][df["y"][j] - min_y][df["z"][j] - min_z] = df.iloc[:, i + 3][j]


然后,我可以简单地将张量转换为所需的必需对象。目前,我的数据集为93164 x 13455,所以我估计这大约需要32个小时。如果这是最好的方法,那么我将等待处理,但是我很想知道是否有人可以提出更快的方法。

最佳答案

因此,如果我正确地理解了您,而不是像这样:

x1 y1 z1 t1 t2 t3


你想要这样的东西吗?

x1 y1 z1 t1

x1 y1 z1 t2

x1 y1 z1 t3


我认为有多种方法可以做到这一点,但是这里有一种使用Pandas中的melt功能的方法。假设您有一个数据框(如下面的数据框),并且需要将t2中的变量移动到t1,或者换句话说,您想要合并t1和t2。

df = pd.DataFrame([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]], columns=['x','y','t1','t2'])

    x   y  t1  t2
0   1   2   3   4
1   5   6   7   8
2   9  10  11  12
3  13  14  15  16
4  17  18  19  20


要执行我认为您想要的操作,可以执行以下操作

f_df = df.melt(id_vars=['x','y'], value_vars = ['t1','t2'], value_name='t').drop('variable', axis=1).sort_values('x')


现在使用f_df:

    x   y   t
0   1   2   3
5   1   2   4
1   5   6   7
6   5   6   8
2   9  10  11
7   9  10  12
3  13  14  15
8  13  14  16
4  17  18  19
9  17  18  20


从这里,您可以简单地将其转换为一个numpy数组

09-26 19:49
查看更多