матрица против списка - переход с Matlab на Python

avatar
user3654852
9 августа 2021 в 00:09
94
0
0

Исходя из опыта работы с Matlab, где все является матрицей/вектором, было очень легко перебирать заданный набор данных и последовательно строить матрицу. Поскольку конечным объектом была матрица, также было очень легко извлечь определенные элементы матрицы. Я нахожу это довольно проблематичным в Python. Я воспроизвел код здесь, чтобы объяснить, где я застрял.

  1. Исходные данные просто временной ряд с месяцем и ценой. Цель состоит в том, чтобы смоделировать выбранные подмножества этих цен. Цикл начинается со сбора всех месяцев в один набор, а затем отбрасывается один месяц в каждом последующем цикле. В течение 12 месяцев у меня будет (n^2 - n)/2 + n, всего 78 столбцов в этом примере. Чтобы было ясно, n — это общее количество периодов времени; 12 в этом наборе данных. Строки матрицы будут представлять собой оценки Z, выбранные из стандартной нормальной переменной — цель состоит в том, чтобы смоделировать все 78 цен за один раз в матрице. Количество z-оценок определяется переменной num_terminal_values, в настоящее время установленной на 5, чтобы все было просто/легко визуализировать на данный момент. Вот ссылка на гугл лист с исходной матрицей гугл лист с корр матом . Код ниже может не работать с листом Google; лист предназначен для того, чтобы показать исходные данные. Мои шаги (и код Python) следующие:

#1 прочитать данные dfCrv = pd.read_excel(xl, имя_листа = 'загрузить', usecols = диапазон (0,2)).dropna(ось=0)

#2 создает переменные цикла, а затем выполняет цикл по данным для построения матрицы. Строки в матрице представляют собой значения Z, выбранные из стандартной нормали (это переменная num_terminal_values). Столбцы относятся к каждому отдельному месяцу моделирования.

import datetime as dt
lst_zUCorr = []

num_terminal_values = 5

as_of = dt.datetime(2020, 12, 1)
max_months = dfCrv.shape[0]
sim_months = pd.date_range(dfCrv['term'].iloc[0], dfCrv['term'].iloc[-1], freq='MS')
end_month = dfCrv['term'].iloc[-1]

dfCrv = dfCrv.set_index('term',drop=False)

for runNum in range(max_months):
    sim_month = dfCrv['term'].iloc[runNum]
    ttm = ((sim_month - as_of).days)/365
    num_months = (end_month.year - sim_month.year) * 12 + (end_month.month - sim_month.month) + 1
    zUCorr = npr.standard_normal(size=(num_terminal_values, num_months))        
    lst_zUCorr.append(zUCorr)
        

исследовать объекты

lst_zUCorr
z  = np.hstack(lst_zUCorr)
z

Пока все работает нормально. Однако я не знаю, как преобразовать объект lst_zUCorr в простую матрицу. Я пробовал hstack и т.д.; но это все еще не похоже на матрицу. Для следующего набора операций требуются данные в простой матричной форме; но то, что я получаю здесь, не является матрицей. Вот изображение:

Ключевой момент/вопрос - окончательная матрица 5x78 в Matlab может использоваться для выполнения большего количества операций. Есть ли способ преобразовать эквивалентный объект Python в матрицу 5x78, или теперь мне нужно будет сделать больше кода для доступа к определенным подмножествам объектов Python?

Code output in Python vs. Matlab

Источник
Cris Luengo
9 августа 2021 в 00:36
2

Используйте NumPy. Его синтаксис вдохновлен MATLAB, хотя и не идентичен. numpy.org/doc/stable/user/numpy-for-matlab-users.html

Ander Biguri
9 августа 2021 в 10:41
1

Да, код MATLAB на питоне лучше всего делать с numpy.array. Это гарантирует, что материал очень похож на MATLAB.

Ответы (0)