如何根据符号找到符号矩阵中元素的索引?

时间:2017-12-29 07:06:58

标签: python numpy matrix sympy

我想在符号矩阵中找到一个值的索引。例如,我想找到在下面的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*LL*Zc,它应该给我索引。但不是-L*Zc*Yc/2的索引。所以预期答案是[(0,1),(1,0)]

1 个答案:

答案 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)