Python Symphy中的索引对象到底是什么?

Python Symphy中的索引对象到底是什么?,python,sympy,Python,Sympy,我不明白sympy中索引对象的作用。文档并没有帮助我太多地理解这个概念 例如: >>> from sympy import symbols, IndexedBase, Idx >>> M = IndexedBase('M') >>> i, j = symbols('i j', cls=Idx) >>> M[i, j] M[i, j] 这个代码是做什么的?什么是M[i,j] 我所了解的只是一个索引对象为单个符号提供索引 我正

我不明白sympy中索引对象的作用。文档并没有帮助我太多地理解这个概念

例如:

>>> from sympy import symbols, IndexedBase, Idx
>>> M = IndexedBase('M')
>>> i, j = symbols('i j', cls=Idx)
>>> M[i, j]
M[i, j]
这个代码是做什么的?什么是
M[i,j]

我所了解的只是一个
索引对象
为单个符号提供索引


我正在寻找一个更好的解释
索引对象
,以及它与
索引数据库
idx
单行解释的关系:它们代表一个不确定的、可能无限大的符号数组

假设你想使用n个符号,你会怎么做?如果n是一个给定的数字,比如10,就很容易了。但它只是n,一个未指定的整数。数学中经常出现这样的公式:“在指数i=1,…,n上加或乘(某物)”

例如,假设我在n维空间Rn中有一个函数,比如f(x)=1/距离(x,0)。当然,距离是坐标平方和的平方根。也许我想求f的偏导数。如何用同情心表达这一切?像这样:

from sympy import *
x = IndexedBase('x')
j, k, n = symbols('j k n', cls=Idx)
f = 1/sqrt(Sum(x[k]**2, (k, 1, n)))
print(f.diff(x[j]))
这将计算f相对于坐标
x[j]
的导数。答案是

-Sum(2*KroneckerDelta(j, k)*x[k], (k, 1, n))/(2*Sum(x[k]**2, (k, 1, n))**(3/2))
这是正确的(尽管如果我们假设j在1..n范围内,分子可能会简化)

在上面的示例中,
x[j]
是索引j的坐标。在您的示例中,
M[i,j]
可以是位置i,j处某个矩阵的条目

  • M是符号数组的名称,其类为IndexedBase
  • i和j是该数组的索引,它们的类是Idx
上面是您将自己实例化的类。M[i,j]的类被编入索引,但您不能通过使用类名来创建这些对象,
M[i,j]
只是这样做

最近的两个问题以及使用索引对象的示例:


索引主要用于两种用例:

  • 带有符号下标的公式。例如,
    \sum{i=1}^n a{i
    。您可以只使用
    Symbol('a_i')
    ,但是
    i
    不是符号,并且在任何方面都与
    Symbol('i')
    相关。例如,
    Sum(a_i,(i,1,n))
    只会给你
    n*a_i
    。相反,
    IndexedBase('a')[i]
    表示
    i
    的每个值的不同符号,
    Sum(IndexedBase('a')[i],(i,1,n))
    有效地表示上述总和

  • N-d阵列。这对于代码生成特别有用,因为例如,用于C或Fortran等语言的Symphy代码打印机将自动打印索引对象作为数组查找

    >>> a = IndexedBase('a')
    >>> i = Idx('i', (1, n))
    >>> ccode(a[i])
    'a[i]'
    >>> fcode(a[i])
    '      a(i)'
    
    这使得使用SymPy符号化地编写基于数组的代码并生成计算它的快速代码变得非常容易


  • 在这种情况下,您可以将
    M
    视为二维数组,而
    i,j
    将是该数组的行/列索引。因此,
    M[i,j]
    的结果将是一个value@CoryKramer我懂了。那么当我们创建M时,元素的初始值是多少?还有,我们为什么要创建这样一个对象?这样做有什么意义?