Я пытаюсь выполнить некоторые матричные вычисления в python и столкнулся с проблемой, когда пытался ускорить свой код, используя массивы с накоплением вместо простых циклов for. Мне нужно создать 2D-массив со значениями (заданными как 1D-массив) по диагонали, но я не смог найти умный способ сделать это с массивами с накоплением.
В старой (циклической) версии я использовал метод np.diag(), который возвращает именно то, что мне нужно (в этом случае 2D-массив), если я даю значения в виде 1D-массива в качестве входных данных. Однако, когда я переключился на массивы с накоплением, мой ввод больше не является 1D-массивом, так что метод np.diag() вместо этого возвращает копию диагонали моего 2D-ввода.
Старая версия с 1D вводом:
import numpy as np
vals = np.array([1,2,3])
mat = np.diag(vals)
print(mat.shape)
Out: (3, 3)
Новая версия с 2D-вводом:
vals_stack = np.repeat(np.expand_dims(vals, axis=0), 5, axis=0)
# btw: is there a better way to repeat/stack my array?
mat_stack = np.diag(vals_stack)
print(mat_stack.shape)
Out: (3,)
Итак, вы можете видеть, что np.diag() возвращает 1D-массив (как и ожидалось из документации), но на самом деле мне нужен стек 2D-массивов. Таким образом, форма mat_stack должна быть (7,3,3), а не (3,). Есть ли какая-нибудь функция для этого в numpy? Или мне нужно перебрать это дополнительное измерение следующим образом:
def mydiag(stack):
diag = np.zeros([stack.shape[0], stack.shape[1], stack.shape[1]])
for i in np.arange(stack.shape[0]):
diag[i,:,:] = np.diag([stack[i,:].ravel()])
return diag