sympy 的高级索引?

Tap*_*ala 7 python numpy sympy

使用 numpy,我可以从带有整数列表的数组中选择任意一组项目:

>>> import numpy as np
>>> a = np.array([1,2,3])
>>> a[[0,2]]
array([1, 3])
Run Code Online (Sandbox Code Playgroud)

这似乎不适用于 sympy 矩阵,因为代码:

>>> import sympy as sp
>>> b = sp.Matrix([1,2,3])
>>> b[[0,2]]
Run Code Online (Sandbox Code Playgroud)

结果出现错误消息:

**Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/sympy/matrices/dense.py", line 94, in __getitem__
    return self._mat[a2idx(key)]
  File "/usr/lib/python2.7/dist-packages/sympy/matrices/matrices.py", line 4120, in a2idx
    raise IndexError("Invalid index a[%r]" % (j, ))
IndexError: Invalid index a[[0, 2]]
Run Code Online (Sandbox Code Playgroud)

我的问题是是否有办法在 sympy 中做到这一点?

Hol*_*olt 6

你的ab并不代表类似的对象,实际上a是一个1x3“矩阵”(一行3列),即向量,而 则b是一个3x1矩阵(3行1列)。

>>> a
array([1, 2, 3])
>>> b
Matrix([
[1],
[2],
[3]])
Run Code Online (Sandbox Code Playgroud)

相当于,不是你numpynumpy.array([[1], [2], [3]])a

知道这一点b[[0,2]]没有任何意义,因为您缺少某个维度的索引。如果只想选择第一行和第三行,则需要指定第二个维度:

>>> b[[0, 2], :]
Matrix([
[1],
[3]])
Run Code Online (Sandbox Code Playgroud)

注意:使用numpy,您可以按照3x1您想要的方式访问矩阵,它看起来simply比 更严格numpy