我想在符号矩阵中找到一个值的索引。例如,我想找到在下面的Q矩阵中具有'Zc'符号的索引。
from sympy import symbols, Matrix
Zc,Yc,L=symbols("Zc Yc L",real=True)
Q=Matrix(([0,Zc,-Y],[-Zc*L,0,L/2],[Yc,-L/2,0]))
预期答案是[(0,1),(1,0)]。
我尝试了numpy.where但它返回了一个空集。也就是说,
numpy.where(A in K_P.free_symbols)
它给了一个空集, (array([0],dtype = int64)
第2部分: 如果Q矩阵是
Q=Matrix(([0,Zc*L/6,-Yc],[-L*Zc/12,0,L/2],[Yc,-L*Zc*Yc/2,0]))
如果我想根据符号的产品找到索引,即Zc*L
。那我该怎么办呢。如果值为Zc*L
和L*Zc
,它应该给我索引。但不是-L*Zc*Yc/2
的索引。所以预期答案是[(0,1),(1,0)]
。
答案 0 :(得分:1)
这确实是一种NumPy风格的操作,它不是特别数学或类似Matrix。要使用NumPy方法,首先先将Q转换为NumPy数组,然后应用lambda expr: Zc in expr.free_symbols
搜索数组。把所有东西放在一起,
idx = np.nonzero(np.vectorize(lambda expr: Zc in expr.free_symbols)(np.array(Q)))
返回(array([0, 1]), array([1, 0]))
警告:这不是行列坐标的元组,这是一个元组[行坐标],[列坐标]。例如,如果右下角有一个Zc,那么idx就是
(array([0, 1, 2]), array([1, 0, 2]))
使用np.array(idx).T
:
array([[0, 1],
[1, 0],
[2, 2]])
或者,如果没有NumPy,只需循环遍历元素并报告您找到的内容。
found = []
for i in range(2):
for j in range(2):
if Zc in Q[i, j].free_symbols:
found.append([i, j])
print(found)
这是对此循环的修改,我们在其中搜索表达式,例如两个符号的乘积。测试是表达式是否被修改,如果该产品被替换为0.此外,显然您不希望其他符号出现?检查是否也添加了。
found = []
for i in range(3):
for j in range(3):
if Q[i, j].subs(Zc*L, 0) != Q[i, j] and Q[i, j].free_symbols == set([L, Zc]):
found.append([i, j])
print(found)