我有一个来自电生理记录的数据集,在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
这也许有帮助。第一次将nd arry改为1d arry;第二次排序;第三次查找数字的索引。在这种情况下,您确实需要迭代所有项。
如果我猜
t_stamp
是一个长度可变的1d数组,那么您可以使用以下方法收集所有元素>;400:如果要收集子列表中的值,请使用
append
。如果需要一个平面列表,请使用extend。你知道吗它仍然在
dset_data
的“行”上迭代,但是从每一行进行选择会快得多。你知道吗如果所有行的长度都是42,那么
dset_data.value
将是一个2d numpy数组:将是选定值的平面数组
相关问题 更多 >
编程相关推荐