python—将纯文本表作为数据立方体导入的最有效方法是什么,其中切片由一列的值在哪里更改决定?

xoshrz7s  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(228)

我有一个数据文件,包含光谱随时间的演变。我可以用 np.loadtxt ,但这将返回一个包含3列的二维数组-文件的精确表示,但不是在每个时间间隔上循环的最佳结构。我想将数据重塑成一个立方体,其中每个切片都包含单个时间步的频谱。
输入文件如下所示:

Time    Wavelength    Flux
1.0     100           30
1.0     101           29
1.0     102           31
...
1.0     200           43
2.0     100           30
2.0     101           29.5
...
2.0     200           42
3.0     100           31
3.0     101           32
...
100     200           37
``` `np.loadtxt` 返回一个nx3数组,其中n是文件中的行数。我希望我的代码使用时间列作为断点递增的行将数据塑造成一个立方体。换句话说,我想要一个光谱列表,其中每个光谱比前一个光谱晚一个时间步。这是我的意思的视觉再现。
我可以想出很多方法来手动循环数据,并将其强制转换为可用的格式,但这似乎既不符合音速,又计算效率低下。我将在许多不同的文件上大量使用这段代码,因此我不能在一个切片中硬编码行数。我看着 `np.shape` ,但它似乎没有明显更快的方法来实现这一点。
有没有一种更快、更像Python的方法来实现这一点?还是每次都在文件上循环以手动确定断点的唯一可行方法?
pepwfjgg

pepwfjgg1#

嗯,我想你的问题可能有一些额外的信息,因为,在这个数据中,不同时间步长的行数总是相同的?在其他文件中,它们也一样吗?
不管怎样,你肯定知道你有多少,你可以使用 numpy.split 在数组中,将数组同时分块。
如果行的数量随着时间的变化而变化,您可以使用 for 循环和 numpy.append 以同时创建子阵列。
编辑
根据您给出的信息,您基本上需要知道每个文件的时间步长中有多少行。
由于我没有你的数据,我建立了一个人工的数据来举例说明

import numpy as np

length=np.random.randint(6,9)

artificial_data = np.transpose((np.concatenate((np.ones(length),2*np.ones(length),3*np.ones(length),4*np.ones(length))),
              np.concatenate((np.random.rand(length),np.random.rand(length),np.random.rand(length),np.random.rand(length))),
              np.concatenate((np.random.rand(length),np.random.rand(length),np.random.rand(length),np.random.rand(length)))))

artificial_data

它给出(这些是随机数,所以每次跑步时都会改变)

array([[1.        , 0.62337349, 0.84582971],
       [1.        , 0.38484415, 0.57365805],
       [1.        , 0.80504472, 0.67706586],
       [1.        , 0.49799682, 0.69909408],
       [1.        , 0.06563674, 0.51799158],
       [1.        , 0.65680522, 0.7616487 ],
       [1.        , 0.11497811, 0.67833476],
       [2.        , 0.74605054, 0.40117761],
       [2.        , 0.47544047, 0.40270957],
       [2.        , 0.79241801, 0.92569317],
       [2.        , 0.69839158, 0.21629401],
       [2.        , 0.7169591 , 0.32631124],
       [2.        , 0.8832162 , 0.55114389],
       [2.        , 0.91455405, 0.28574292],
       [3.        , 0.61089879, 0.77563826],
       [3.        , 0.15776237, 0.64906268],
       [3.        , 0.80971068, 0.76695185],
       [3.        , 0.88994052, 0.07681381],
       [3.        , 0.71479789, 0.50768739],
       [3.        , 0.56042634, 0.25032607],
       [3.        , 0.44866057, 0.54832829],
       [4.        , 0.2643985 , 0.62251815],
       [4.        , 0.21353805, 0.91354626],
       [4.        , 0.75809504, 0.71601593],
       [4.        , 0.84296248, 0.87818252],
       [4.        , 0.95029666, 0.10553645],
       [4.        , 0.42500662, 0.92322183],
       [4.        , 0.95176257, 0.63409806]])

现在,从第一列我们可以确定最大时间步长(我不知道这个数量在您的情况下是否有所不同)。
有了这个数字,我们基本上知道如何分割数据,所以我们转置数据,删除第一列有时间步长的数据,我们将其转置回原始形式,然后根据次数进行分割。这看起来像

num_of_time_steps = int(max(np.transpose(artificial_data)[0]))
separated_data = np.split(np.transpose(np.transpose(artificial_data)[1:]),num_of_time_steps)
separated_data

它给出了所需的输出

[array([[0.62337349, 0.84582971],
        [0.38484415, 0.57365805],
        [0.80504472, 0.67706586],
        [0.49799682, 0.69909408],
        [0.06563674, 0.51799158],
        [0.65680522, 0.7616487 ],
        [0.11497811, 0.67833476]]),
 array([[0.74605054, 0.40117761],
        [0.47544047, 0.40270957],
        [0.79241801, 0.92569317],
        [0.69839158, 0.21629401],
        [0.7169591 , 0.32631124],
        [0.8832162 , 0.55114389],
        [0.91455405, 0.28574292]]),
 array([[0.61089879, 0.77563826],
        [0.15776237, 0.64906268],
        [0.80971068, 0.76695185],
        [0.88994052, 0.07681381],
        [0.71479789, 0.50768739],
        [0.56042634, 0.25032607],
        [0.44866057, 0.54832829]]),
 array([[0.2643985 , 0.62251815],
        [0.21353805, 0.91354626],
        [0.75809504, 0.71601593],
        [0.84296248, 0.87818252],
        [0.95029666, 0.10553645],
        [0.42500662, 0.92322183],
        [0.95176257, 0.63409806]])]

现在,您可以通过如下所示的分离数据的第一个索引来访问给定时间步中的每个数据

data_with_time_step_i = separated_data[i]

希望这能帮到你,我无法详细说明比这更简单的事情

相关问题