NumPy, представляющий массив матриц - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть массив комплексных матриц 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

преобразование: вероятно, потребуется предварительное распределение цикла и массива

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...