Продолжить подсчет после заполнения 8-битного счетчика в dict

Начнем с того, что это моя первая программа на 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, 243, 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 )

Это просто подсчет, т. е. [1, 2, 3, 4, 5, ..]? Он пропускает или повторяет цифры, например [254, 0, 1, ...] или [253, 253, 254, 255, 0, 1, ...]?

Michael Cao 19.06.2024 16:18

действительно, он будет считать [0, 1, 2, 3, 4, 5, ... 254, 255, 0, 1, 2]. Поэтому, когда подсчет сбрасывается, он должен продолжаться.

Cabonko 19.06.2024 17:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, есть много способов починить этот счетчик. Вот один из них:

Начнем с проверки того, что мы работаем с массивами numpy. См. мою последнюю заметку внизу об этом.

z = np.asarray(z)

Затем мы обнаруживаем, что произошел циклический обход:

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 на одну запись меньше, чем в базовом счетчике.

counter = z.astype(int)
counter[1:] += wraparound

Чтобы написать это как можно меньшим количеством строк:

z = np.asarray(z)
counter = z.astype(int)
counter[1:] += (z[1:] < z[:-1]).astype(int).cumsum() * 256

Примечание: x, y, z = zip(*relevent_data) очень неэффективен, поскольку заменяет все пустые массивы базовыми типами Python. Вместо этого напишите это, чтобы получить транспонированные представления массива: x, y, z = relevent_data.T

У меня недостаточно репутации, чтобы проголосовать за ваш ответ, но вы решили мои проблемы. Спасибо за ваше время.

Cabonko 19.06.2024 18:57

Другие вопросы по теме