在numpy数组中迭代

时间:2018-11-03 18:02:37

标签: python python-3.x

我有3个2x2矩阵P1,P2和P3,其中填充有随机生成的整数。我想确保这些矩阵是正定的(即所有特征值都大于0)。我的代码在下面。

P1 = np.random.randint(10, size=(m,n))
P2 = np.random.randint(10, size=(m,n))
P3 = np.random.randint(10, size=(m,n))
lambda1 = np.linalg.eigvals(P1)
lambda2 = np.linalg.eigvals(P2)
lambda3 = np.linalg.eigvals(P3)
for i in lambda1:  
  if (i <= 0): P1 = np.random.randint(10, size=(m,n))
for i in lambda2:
  if (i <= 0): P2 = np.random.randint(10, size=(m,n))
for i in lambda3:
  if (i <= 0): P3 = np.random.randint(10, size=(m,n))
print('Eigenvalue output to to verify that matrices are positive definite:\n')
print(u'\u03BB(P\u2081) = '  + str(np.linalg.eigvals(P1)))
print(u'\u03BB(P\u2082) = '  + str(np.linalg.eigvals(P2)))
print(u'\u03BB(P\u2083) = '  + str(np.linalg.eigvals(P3)))

现在,如果特征值不是正值,则if语句将重新生成矩阵一次或两次,但是不会验证特征值始终为正值。我的第一个猜测是将一个while循环嵌套在for循环中,但是我无法找到一种使该循环起作用的方法,而且我不确定这是否是最有效的方法。

2 个答案:

答案 0 :(得分:2)

此函数创建一个具有正特征值的数组:

14

首先,我定义小于0的虚拟特征值。然后,我创建一个新数组并计算其特征值。如果特征值(OV0214为负,则创建一个新的特征值。

答案 1 :(得分:0)

作为上述答案的补充,也可以通过删除函数的任何输入参数并仅在函数内定义原始矩阵来进一步简化此过程:

def create_arr_with_pos_ev():
  arr = np.random.randint(10, size=(m,n))
  ev = np.linalg.eigvals(arr)
  while not all (ev >0):
    arr = np.random.randint(10, size=(m,n))
    ev = np.linalg.eigvals(arr)
  print('\nMatrix: \n' + str(arr) + '\nEigenvalues: \n',ev)
  return arr, ev

打印:

P1,eig1=create_arr_with_pos_ev()
P2,eig2=create_arr_with_pos_ev()
P3,eig3=create_arr_with_pos_ev()

输出:

Matrix: 
[[6 0]
 [3 7]]
Eigenvalues: 
 [7. 6.]

Matrix: 
[[9 3]
 [4 2]]
Eigenvalues: 
 [10.4244289  0.5755711]

Matrix: 
[[5 6]
 [3 8]]
Eigenvalues: 
 [ 2. 11.]