/ / Чи є спосіб зробити складні змінні запису масиву в NumPy? - python, масиви, numpy, матриця, множення матриць

Чи є спосіб зробити складові змінні масивів у NumPy? - python, масиви, numpy, матриця, множення матриць

Я працюю з цифровими масивами в Python. Чи є спосіб зберегти записи array як змінні так, щоб вони слідували за належним множенням матриць та іншими матричними функціями (додавання, детермінант тощо)?

Наприклад:

         import numpy as np
A = np.array([[a, b], [c, d]])
B = np.array([[e, f], [g, h]])
C = np.dot(A,B)

# C should be [ae+bf ag+bh]
#             [ce+df cg+dh]

Крім того, оскільки мої матричні елементи є складними взагалі, я хотів би, щоб ці записи типу a+ib де i інтерпретується як уявний корінь 1, а не як змінна. Я можу написати код, який визначає мої власні функції, але чи є це чистий спосіб зробити це?

Відповіді:

2 для відповіді № 1

Використовуйте sympy:

from  sympy import *

A=MatrixSymbol("A", 2, 2)
B=MatrixSymbol("B", 2,2)
print Matrix(A)
print  Matrix(A*B)

>>>Matrix([[A[0, 0], A[0, 1]], [A[1, 0], A[1, 1]]])
Matrix([[A[0, 0]*B[0, 0] + A[0, 1]*B[1, 0], A[0, 0]*B[0, 1] + A[0,  1]*B[1, 1]], [A[1, 0]*B[0, 0] + A[1, 1]*B[1, 0], A[1, 0]*B[0, 1] + A[1, 1]*B[1, 1]]])

3 для відповіді № 2

Дивіться тут: Використання комплексних чисел у python

Numpy поважає уявні числа Python.

>>> a = np.array([i+1j for i in range(3)])
>>> b = np.array([i+2j for i in range(3,6)])
>>> a*b
array([-2.+3.j,  2.+6.j,  8.+9.j])

Це теж працює з вашим прикладом (як очікується):

>>> a
array([[ 1.+1.j,  1.+2.j],
[ 1.+1.j,  1.+2.j]])
>>> b
array([[ 1.+1.j,  1.+2.j],
[ 1.+1.j,  1.+2.j]])
>>> np.dot(a,b)
array([[-1.+5.j, -4.+7.j],
[-1.+5.j, -4.+7.j]])

Що стосується збереження їх як змінних, NumPy передає все через інтерфейс Python до коду нижчого рівня C, тому я сумніваюся, що ви можете зберегти все як змінну.

Проте ви можете написати довільну функцію, яка виконує це завдання:

def myfunc(obj):
A = np.array([[obj["a"]], [obj["b"]]])
B = np.array([[obj["c"]], [obj["d"]]])
C = np.dot(A,B)
return C