У меня есть массив комплексных матриц 2x2, который представляет собой преобразование матрицы рассеяния во времени. Для моих расчетов мне нужен способ умножения таких массивов между собой (умножение матриц); умножить каждую матрицу в массиве на другую матрицу; применить преобразование ко всем матрицам в массиве.
Я пробовал несколько способов сделать это с помощью numpy
(4 столбца массива, массива массивов, массива матриц, списка матриц), но каждый из них, предоставляя приятный интерфейс для некоторых из необходимых функции, делает отдых очень неловко.
Итак, вот вопрос - как лучше всего представлять такие структуры и как бы я выполнял над ними необходимые преобразования?
примеры
Первоначально данные находятся в csv
файле:
import numpy as np
csv = np.arange(45.).reshape(5,9)
t = np.array(csv[:,0]) # time array
массив из 4 столбцов
преобразование csv
в массив из 4 столбцов:
data = np.apply_along_axis(lambda x: [x[1]+1j*x[2],
x[3]+1j*x[4],
x[5]+1j*x[6],
x[7]+1j*x[8]],1,csv)
массив х матрица:
m = np.array([[1,0],[0,0]])
np.apply_along_axis(lambda x: (x.reshape(2,2).dot(m)).reshape(1,4),1,data)
массив х массив:
вероятно, потребуется предварительное распределение цикла и массива
преобразование:
np.apply_along_axis(lambda x: [-(x[0]*x[3]-x[1]*x[2])/x[2],
x[0]/x[2],
-x[3]/x[2],
1/x[2]],1,data)
список массивов
преобразование csv
в список массивов:
data = [np.array([[i[1]+1j*i[2],
i[3]+1j*i[4]],
[i[5]+1j*i[6],
i[7]+1j*i[8]]]) for i in csv]
массив х матрица:
m = np.array([[1,0],[0,0]])
[i.dot(m) for i in data]
массив х массив:
[data[i].dot(data[i]) for i in range(len(data))]
преобразование:
[np.array([[-(np.linalg.det(x))/x[0,1],
x[0,0]/x[1,0]],
[-x[1,1]/x[0,1],
1/x[0,1]]]) for x in data]
массив матриц
преобразование csv
в массив матриц:
data = np.apply_along_axis(lambda x: [[x[1]+1j*x[2],
x[3]+1j*x[4]],
[x[5]+1j*x[6],
x[7]+1j*x[8]]],1,csv)
массив х матрица:
m = np.array([[1,0],[0,0]])
data.dot(m)
массив х массив:
вероятно, потребуется предварительное распределение цикла и массива
data * data # not a dot product
преобразование:
вероятно, потребуется предварительное распределение цикла и массива