【问题标题】:Multidimensional symbolic matrix in PythonPython中的多维符号矩阵
【发布时间】:2016-02-28 11:27:50
【问题描述】:

我想通过计算每个索引组合的值来创建一个特定大小的 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: 无法将表达式转换为浮点数

据我所知,这是由于结合了 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 矩阵,以便能够在嵌套循环中使用它,这涉及到符号计算?

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

【问题讨论】:

    标签: python numpy matrix sympy


    【解决方案1】:

    您得到的第一个错误是,正如您所建议的,因为您尝试将 sympy 类型对象保存到类型为 numbers 的 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!
    

    【讨论】:

    • SymPy 有一个 Matrix 类型。如果你正在创建一个符号矩阵,最好使用它。
    • 其实我没有注意到矩阵是3D的。在 SymPy 1.0 中,您将能够使用 sympy.tensor.array.Array
    猜你喜欢
    • 1970-01-01
    • 2011-08-08
    • 2018-02-13
    • 2015-05-23
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多