Как можно подавить оценку, все еще будучи в состоянии индексировать?
У меня есть две маленькие, но очень сложные матрицы, которые я хочу умножить. Я сделал это с помощью sympy:
C=sympy.MatMul(A,B,hold=True)
Это дает мне объект MatMul, который экономит огромное количество времени, и я все равно не интересуюсь символическим выражением, скорее я хочу оценить его в определенных точках позже.
Если бы это был конец моих вычислений, это было бы хорошо, но тогда мне нужно использовать элементы C, чтобы определить новое уравнение, однако я не могу его проиндексировать. Я получаю следующее,
In [286]: C[0]
Traceback (most recent call last):
File "<ipython-input-286-829e2440bf19>", line 1, in <module>
C[0]
File "C:\Anaconda3\lib\site-packages\sympy\matrices\expressions\matexpr.py", line 242, in __getitem__
raise IndexError("Single index only supported for "
IndexError: Single index only supported for non-symbolic matrix shapes.
Можно ли как-то индексировать такой объект? Например, в клене я могу использовать точку с запятой, которая подавляет вывод, сохраняя при этом информацию о структуре результирующего объекта, чтобы я мог ее проиндексировать.
2 ответа
Вы можете индексировать элементы C
например, C[0,0]
, Так что это даст вам первую строку в виде списка:
row0 = [C[0, k] for k in range(C.shape[1])]
Вот пример. x
а также y
Симпи символы.
In [40]: A
Out[40]:
Matrix([
[2*x + 1, x + 3],
[ -2, 3]])
In [41]: B
Out[41]:
Matrix([
[-3, 3],
[ y, 2*y]])
In [42]: C = sympy.MatMul(A, B, hold=True)
In [43]: C[0,0]
Out[43]: -6*x + y*(x + 3) - 3
In [44]: [C[0,k] for k in range(C.shape[1])]
Out[44]: [-6*x + y*(x + 3) - 3, 6*x + 2*y*(x + 3) + 3]
Чтобы объяснить ошибку, обычно один индекс индексирует матрицу строка за строкой:
In [8]: M = Matrix([[1, 2], [3, 4]])
In [9]: M
Out[9]:
⎡1 2⎤
⎢ ⎥
⎣3 4⎦
In [10]: M[0]
Out[10]: 1
In [11]: M[1]
Out[11]: 2
In [12]: M[2]
Out[12]: 3
In [14]: M[3]
Out[14]: 4
Для символа символьной матрицы это вычисляется как строка, индекс столбца. Например,
In [16]: MatrixSymbol('A', 3, 4)[0]
Out[16]: A₀₀
In [17]: MatrixSymbol('A', 3, 4)[10]
Out[17]: A₂₂
Элемент A[10]
автоматически преобразуется в A[2, 2]
, потому что A имеет 4 столбца, поэтому 10 является третьим столбцом третьей строки (помните, что все индексировано 0).
Однако, если ваша фигура является символической, особенно количество столбцов, скажем, A
это mxn, нет способа узнать, какая строка, столбец A[i]
относится к (n % i
это символично). Вероятно, SymPy можно изменить, чтобы сделать A[i]
вернуть A[i//n,i%n]
символически, но вы все равно хотите явно ссылаться на элементы матрицы по строке, столбцу, так что если вы действительно этого хотите, вы можете просто сделать это вручную. Кроме того, эта формула не имеет проверки границ (если i >= n*m
элемент находится за пределами).
Строго говоря, A[0]
возможно, сработает, так как это всегда будет A[0, 0]
независимо от формы А. Однако это будет отдельный особый случай, и SymPy решил запретить его, поскольку можно просто написать явное A[0, 0]
тем не мение.