Допустим, у меня есть следующий фрейм данных:
idx = ['H',"A","B","C","D"]
idxp = idx[1:] + [idx[0]]
idxm = [idx[-1]] + idx[:-1]
idx, idxp, idxm
j = np.arange(25).reshape(5,5)
J = pd.DataFrame(j, index=idx, columns=idx)
np.fill_diagonal(J.values, 0)
J
В качестве вывода я хотел бы получить массив такой, что:
- мы имеем нули повсюду в нижней части матрицы внизу и на диагонали
- имеют значения в верхней части матрицы, рассчитанные путем взятия чисел чуть выше диагонали матрицыJ, поэтому вектор v = [1, 7, 13, 19].
- Используя v, вычислите первую строку как совокупную сумму v от начала до конца и получите [1, 8, 21, 40]
- Используя v, вычислите во второй строке совокупную сумму v от второго индекса до конца и получите [7, 20, 39]
- и т. Д., Пока не достигнете последнего индекса v
Другими словами, это даст нам следующую матрицу:
m_exp = np.array([[0,1,8,21,40],
[0,0,7,20,39],
[0,0,0,13,32],
[0,0,0,0,19],
[0,0,0,0,0],
])
Наилучший способ, который я нашел для вычисления этой матрицы на данный момент, заключается в использовании кода ниже:
travelup = np.array([np.pad(np.cumsum(J.values.diagonal(1)[n:]), (n+1,0), 'constant') for n in range(J.values.shape[0])])
Однако это включало список понимания, и на практике моя матрица намного больше иs-код вызывается тысячи раз.
Есть ли способ преобразовать процесс, используя отображение, чтобы сделать его быстрее, избегая циклов?