有没有办法在 NumPy 中使数组条目成为复杂变量?
Is there a way to make array entries complex variables in NumPy?
我在 Python 中使用 numpy 数组。有没有办法将 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 的虚根而不是变量。我可以编写定义我自己的函数的代码,但是有一种简洁的方法吗?
看这里:
Complex numbers usage in 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
使用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]]])
我在 Python 中使用 numpy 数组。有没有办法将 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 的虚根而不是变量。我可以编写定义我自己的函数的代码,但是有一种简洁的方法吗?
看这里: Complex numbers usage in 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
使用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]]])