Я нахожусь в академической среде и работаю над переводом части моей базы кода анализа данных из MATLAB в Python 3.x (Anaconda), используя numpy и scipy, чтобы работать с некоторыми сотрудниками, у которых нет доступаЛицензия MATLAB. Я также использую это в качестве предлога для улучшения своих возможностей на Python вместо того, чтобы просто копировать все это в Octave и исправлять любые небольшие проблемы, которые возникают. На данный момент у меня есть некоторый базовый опыт работы с python, но у меня возникают проблемы с репликацией поведения некоторых классов обработки данных в моей базе кода MATLAB с классами Python. Рассматриваемый класс в основном содержит куски спектральных данных вместе с идентификатором и некоторым базовым анализом.
По сути, в MATLAB я получаю экземпляр рассматриваемого класса Nx1. Это позволяет мне смотреть на вещи по каждому сигналу путем индексации родительского объекта, который я использую для передачи всех связанных данных для сигнала в последующие функции анализа.
Например:
% Sample Data
positions = [195, 250, 280];
widths = [5, 5, 10];
Data = DataObject(positions, widths)
>> Data(1)
ans =
DataObject with properties:
value_a: 195
value_b: 5
Это также позволяет мне легко получать значения для всех сигналов, что позволяет легко поместить их в электронную таблицу или отчет. например,
>> [Data.value_a]'
ans = [195, 250, 280]
(Примечание: я знаю, что в этом примере это просто возврат ввода, но есть и производные значения, которые меня интересуют в реальном коде.)
I 'мы пытались выяснить, как повторить это поведение в python, поэтому в идеале я мог бы сделать что-то вроде этого:
positions = np.array([195, 250, 280])
widths = np.array([5, 5, 10])
Data = DataObject(positions, widths)
>>> Data[1]
<A DataObject containing only the data for the first signal>
>>> Data.value_a
array([195, 250, 280])
Я попытался сделать что-то похожее на то, что я делаю в MATLAB, используя
for idx in range(len(centers)):
self[idx].center = centers[idx]
в методе __init__, но он просто дает мне:
TypeError: 'SignalPeak' object is not subscriptable
Большинство результатов Google, которые я смог найти, касаются того, как несколько экземпляров объекта вращаются вокруг помещения их в списока затем просто перебирая их вручную, когда вы хотите посмотреть на свойства всех из них. Но мне интересно, есть ли способ сделать это, который будет более похож на то, что делает мой оригинальный код, или, по крайней мере, включит это поведение в определение класса.
Определение класса MATLAB:
classdef DataObject
properties
value_a
value_b
end
methods
function obj = DataObject(reference, data)
% reference: a Nx1 vector
% data: a Nx1 vector
obj(size(reference,1),size(reference,2)) = obj; % Creates a Nx1 SignalPeak object
% Sets the various values
for idx = 1:length(centers(:))
obj(idx).value_a = reference(idx)
obj(idx).value_b = data(idx)
end
end
end
end