Начнем с того, что это моя первая программа на 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, 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 )
действительно, он будет считать [0, 1, 2, 3, 4, 5, ... 254, 255, 0, 1, 2]. Поэтому, когда подсчет сбрасывается, он должен продолжаться.
Вероятно, есть много способов починить этот счетчик. Вот один из них:
Начнем с проверки того, что мы работаем с массивами 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
У меня недостаточно репутации, чтобы проголосовать за ваш ответ, но вы решили мои проблемы. Спасибо за ваше время.
Это просто подсчет, т. е.
[1, 2, 3, 4, 5, ..]
? Он пропускает или повторяет цифры, например[254, 0, 1, ...]
или[253, 253, 254, 255, 0, 1, ...]
?