dict中8位计数器满后继续计数

问题描述 投票:0回答:1

首先,这是我的第一个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()

总结我的挑战:

  • 如何从字典或元组中逐一读取数据并在必要时更改它
  • 如何在计数器达到256时继续计数而不是重置

注意:上面是来自不同来源的乱码,我对自己在做什么的了解有限,但渴望学习。

到目前为止,我已经尝试在网上查找如何使用元组或字典来解决这个问题,但没有帮助。

编辑:计数从 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)

python dictionary tuples hdf5 8-bit
1个回答
0
投票

可能有很多方法可以修复该计数器。这是一个:

我们首先检测是否发生了回绕:

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

旁注:

  1. 如果你从来没有间隙,那为什么还要看柜台呢?只需将其替换为
    np.arange(z[0], z[0] + len(z))
  2. x, y, z = zip(*relevent_data)
    效率非常低,因为它用基本的 Python 类型替换了所有 numpy 数组。写这个来获取数组:
    x, y, z = relevent_data.T
© www.soinside.com 2019 - 2024. All rights reserved.