Если я умножу вектор x
(1, n) на себя, то есть np.dot(x.T, x)
, я получу матрицу в квадратичной форме.
Если I имеют матрицу Xmat
(k, n), как я могу эффективно вычислить продукт роллинга и выбрать только верхние треугольные элементы?
Итак, атм. У меня есть следующее решение:
def compute_interaction(x):
xx = np.reshape(x, (1, x.size))
return np.concatenate((x, np.dot(xx.T, xx)[np.triu_indices(xx.size)]))
Затем compute_interaction(np.asarray([2,5]))
yield array([ 2, 5, 4, 10, 25])
.
И когда у меня есть матрица Я использую
np.apply_along_axis(compute_interaction, axis=1, arr = np.asarray([[2,5], [3,4], [8,9]]))
, который дает то, что я хочу:
array([[ 2, 5, 4, 10, 25],
[ 3, 4, 9, 12, 16],
[ 8, 9, 64, 72, 81]])
Есть ли другой способ, чем вычислить это, используя apply_along_axis
? Возможно, используя np.einsum
?
Подход № 1
Одно из решений с
np.triu_indices
будет -Подход # 2
Быстрее с
slicing
-Сроки -
Для чего стоит
apply_along_axis
:apply...
- это просто удобный инструмент, чтобы сделать итерацию по нескольким осям более четкой (но не быстрее).