快速浏览一长串数组的方法

2024-09-29 17:19:12 发布

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

我有一个来自电生理记录的数据集,在hdf5文件中,以我的理解非常接近numpy阵列的形式存在,我正在尝试以最有效和最快速的方式访问它。你知道吗

让我解释一下:数据集是数组列表(2D数组?);每个数组包含x个通道(记录站点),通常在32-64个左右。你知道吗

问题如下:有数百万个数组,循环遍历每个数组需要花费很长时间。此外,我必须循环每个数组中的每个通道以检索值。你知道吗

这是我的密码:

import h5py

f_kwd = h5py.File("experiment1_100.raw.kwd", "r") # reads hdf5 file
dset_data = f_kwd['recordings/0/data']
print (len(dset_data)) # prints 31646700
print (dset_data[0]) # prints the following

[    94   1377    208    202    246    387   1532   1003    460    665
810    638    223    363    990     78   -139    191     63    630
763     60    682   1025    472   1113   -137    360   1216    297
-71    -35   -477   -498   -541   -557  27776   2281 -11370  32767
-28849 -30243]

list_value = []
for t_stamp in (dset_data):
    for value in t_stamp:
        if value > 400:
            list_value.append(value)

有没有办法让这更高效快捷? 我必须使用numpy吗?如果是,我如何才能做到这一点?我觉得我做错了什么。你知道吗

编辑: 以下是有关以下属性的数据集中第一个数组的其他信息:

.shape -> (42,)
.itemsize -> 2
.dtype -> int16
.size -> 42
.ndim -> 1

编辑2: ..以及数据集本身:

.shape -> (31646700, 42)
.dtype -> int16
.size -> 1329161400


Tags: 数据numpyfordatavaluestamp记录数组
2条回答

这也许有帮助。第一次将nd arry改为1d arry;第二次排序;第三次查找数字的索引。在这种情况下,您确实需要迭代所有项。

import numpy as np

newData = dset_data.ravel()
newData.sort()
index = np.searchsorted(data,400)
res = newData[:index ]

如果我猜t_stamp是一个长度可变的1d数组,那么您可以使用以下方法收集所有元素>;400:

list_value = []
for t_stamp in (dset_data):
    list_value.append(t_stamp[t_stamp>400])
    # list_value.extend()

如果要收集子列表中的值,请使用append。如果需要一个平面列表,请使用extend。你知道吗

它仍然在dset_data的“行”上迭代,但是从每一行进行选择会快得多。你知道吗

如果所有行的长度都是42,那么dset_data.value将是一个2d numpy数组:

dset_data[dset_data>400]

将是选定值的平面数组

相关问题 更多 >

    热门问题