Я працюю з цифровими масивами в 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