首页 文章

Python中的多维符号矩阵

提问于
浏览
5

我想通过计算每个索引组合的值来创建特定大小的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:无法将表达式转换为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()只需4个参数(给定5个)

总而言之,我的问题是:如何创建一个包含内部任何变量的3D矩阵,以便能够在嵌套循环中使用它,这涉及符号计算?

(这是我在这个社区的第一篇文章,所以如果我做错了,请告诉我 . )

1 回答

  • 3

    您得到的第一个错误是,因为您尝试将 sympy 类型对象保存到 numpy 零数组中,该数组的类型为数字 . 一种选择是使用 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!
    

相关问题