Python 中的多维符号矩阵
Multidimensional symbolic matrix in Python
我想通过计算每个索引组合的值来创建特定大小的 3D 矩阵。矩阵中的每个值都是象征性的。
到目前为止我尝试过的:
import numpy as np
import sympy as sp
var1 = np.arange(1,10,2)
var2 = np.arange(1,10,2)
var3 = np.arange(20,50,5)
myMatrix = np.zeros(shape = (len(var1), len(var2), len(var3)))
t = sp.symbols('t')
for ii in range(len(var1)):
for jj in range(len(var2)):
for kk in range(len(var3)):
myMatrix[ii][jj][kk] = var1[ii] * var2[jj] * var3[kk] * t
这给了我错误:
TypeError: can't convert expression to float
据我所知,这是由于结合了 numpy 和 sympy。因此,我尝试了:
myMatrix = sp.MatrixSymbol('temp', len(var1), len(var2), len(var3))
而不是:
myMatrix = np.zeros(shape = (len(var1), len(var2), len(var3)))
出现错误:
TypeError: new() takes exactly 4 arguments (5 given)
综上所述,我的问题是:如何创建一个内部包含任何变量的 3D 矩阵,以便能够在涉及符号计算的嵌套循环中使用它?
(这是我第一次 post 在这个社区,所以如果我做错了什么,请告诉我。)
您得到的第一个错误是,正如您所建议的,因为您试图将 sympy
类型的对象保存到 numpy
zeros 数组中,该数组的类型是数字。一种选择是使用 numpy
对象数组,其工作方式如下,
import numpy as np
import sympy as sp
var1 = np.arange(1,10,2)
var2 = np.arange(1,10,2)
var3 = np.arange(20,50,5)
myMatrix = np.empty((len(var1), len(var2), len(var3)), dtype=object)
t = sp.symbols('t')
for ii in range(len(var1)):
for jj in range(len(var2)):
for kk in range(len(var3)):
myMatrix[ii][jj][kk] = var1[ii] * var2[jj] * var3[kk] * t
虽然对于大尺寸来说这不是太有效而且不是 numpy 应该工作的方式。对于 sympy 数组,这可能是唯一的方法,但是看起来,至少在我的 sympy (0.7.1.rc1) 版本中,不支持 3D 数组。对于
myMatrix = sp.zeros((len(var1), len(var2), len(var3)))
我收到以下错误
ValueError: Matrix dimensions should be a two-element tuple of ints or a single int!
我想通过计算每个索引组合的值来创建特定大小的 3D 矩阵。矩阵中的每个值都是象征性的。
到目前为止我尝试过的:
import numpy as np
import sympy as sp
var1 = np.arange(1,10,2)
var2 = np.arange(1,10,2)
var3 = np.arange(20,50,5)
myMatrix = np.zeros(shape = (len(var1), len(var2), len(var3)))
t = sp.symbols('t')
for ii in range(len(var1)):
for jj in range(len(var2)):
for kk in range(len(var3)):
myMatrix[ii][jj][kk] = var1[ii] * var2[jj] * var3[kk] * t
这给了我错误:
TypeError: can't convert expression to float
据我所知,这是由于结合了 numpy 和 sympy。因此,我尝试了:
myMatrix = sp.MatrixSymbol('temp', len(var1), len(var2), len(var3))
而不是:
myMatrix = np.zeros(shape = (len(var1), len(var2), len(var3)))
出现错误:
TypeError: new() takes exactly 4 arguments (5 given)
综上所述,我的问题是:如何创建一个内部包含任何变量的 3D 矩阵,以便能够在涉及符号计算的嵌套循环中使用它?
(这是我第一次 post 在这个社区,所以如果我做错了什么,请告诉我。)
您得到的第一个错误是,正如您所建议的,因为您试图将 sympy
类型的对象保存到 numpy
zeros 数组中,该数组的类型是数字。一种选择是使用 numpy
对象数组,其工作方式如下,
import numpy as np
import sympy as sp
var1 = np.arange(1,10,2)
var2 = np.arange(1,10,2)
var3 = np.arange(20,50,5)
myMatrix = np.empty((len(var1), len(var2), len(var3)), dtype=object)
t = sp.symbols('t')
for ii in range(len(var1)):
for jj in range(len(var2)):
for kk in range(len(var3)):
myMatrix[ii][jj][kk] = var1[ii] * var2[jj] * var3[kk] * t
虽然对于大尺寸来说这不是太有效而且不是 numpy 应该工作的方式。对于 sympy 数组,这可能是唯一的方法,但是看起来,至少在我的 sympy (0.7.1.rc1) 版本中,不支持 3D 数组。对于
myMatrix = sp.zeros((len(var1), len(var2), len(var3)))
我收到以下错误
ValueError: Matrix dimensions should be a two-element tuple of ints or a single int!