首先,这是我的第一个Python程序,所以我对部分代码的工作方式会有一些误解。
数据是从 8 位内存中提取的,该数据保存在 HDF5 文件中,我需要使用该 HDF5 数据。我想要使用的该文件的字典有 3 个键,每个键都有多个值。其中一个键是计数器,当它达到 256 时,它将重置为 0。由于 8 位内存,这是预期的。
所以我的挑战是读取这个键的数据,当它溢出时,然后从以前的值开始计数,而不是重置。这是需要在 x 轴上绘制计数器的连续图。
我的问题始于如何逐一读出特定键的值,并在需要时更改它。对于半工作代码(将计数器重置为 0,但绘制它),我使用 zip() 将字典解压为元组(?)。但此后我又陷入困境了。
这是到目前为止的完整代码。
import h5py
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
measdatapath = Path(r'C:\Users\...')
title = 'Best_test_data_ever.hdf5'
plotpath = measdatapath / title
data = h5py.File(plotpath, 'r')
list(data.keys())
relevant_data = data['HDF5Data'][:]
# variable z is the counter
x, y, z = zip(*relevent_data)
fig, axs = plt.subplots(2,1, sharex=True)
axs[0].plot(z,x)
axs[0].set_ylabel("Awesome line")
axs[0].xaxis.set_label_position('top')
axs[0].set_title(title)
axs[1].plot(z,y)
axs[1].set_ylabel("Almost as awesome line")
axs[1].set_xlabel("Broken counter")
plt.show()
总结我的挑战:
注意:上面是来自不同来源的乱码,我对自己在做什么的了解有限,但渴望学习。
到目前为止,我已经尝试在网上查找如何使用元组或字典来解决这个问题,但没有帮助。
编辑:计数从 0 到 255,然后重置为 0。在我从数据中得到的当前计数下方:
(3, 7, 10, 14, 17, 21, 24, 28, 31, 34, 39, 42, 45, 48, 51, 54, 57, 61, 64, 67, 70, 73, 77, 80, 84、88、91、94、98、100、104、107、111、114、117、121、124、127、131、133、137、140、143、146、150、153、157、160、164、 167、170、173、176、179、183、186、189、191、195、198、201、203、207、210、213、217、220、223、227、230、233、236、240、 3、 246、249、253、1、4、8、11、15、18、22、25、28、32、35、39、42、46、49、52、55、58、61、65、68、72、 75)
可能有很多方法可以修复该计数器。这是一个:
我们首先检测是否发生了回绕:
wraparound = z[1:] < z[:-1]
这给了我们一个像
[false, false, ..., true, false, ..., true, false, ...]
这样的数组。我们将其转换为整数数组[0, 0, ..., 1, 0, ..., 1, 0, ...]
。
wraparound = wraparound.astype(int)
np.cumsum
来累积到给定索引为止发生回绕的频率。这给了我们一个数组[0, 0, ..., 1, 1, ... 2, 2, ...]
。
wraparound = wraparound.cumsum()
现在我们只需乘以 256 并将其添加到计数器即可。请注意,
wraparound
数组的条目比基本计数器少 1 个。
counter = z.astype(int)
counter[1:] += wraparound
用尽可能少的行来写:
counter = z.astype(int)
counter[1:] += (z[1:] < z[:-1]).astype(int).cumsum() * 256
旁注:
np.arange(z[0], z[0] + len(z))
x, y, z = zip(*relevent_data)
效率非常低,因为它用基本的 Python 类型替换了所有 numpy 数组。写这个来获取数组:x, y, z = relevent_data.T