python - 在 numpy 数组中迭代
问题描述
我有 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 语句几乎会重新生成一次或两次矩阵,但它不会验证特征值是否总是正数。我的第一个猜测是在 for 循环中嵌套一个 while 循环,但我想不出一种方法来让它工作,我不确定这是否是最有效的方法。
解决方案
此函数创建一个具有正特征值的数组:
def create_arr_with_pos_ev(m,n):
ev = np.array([-1,-1])
while not all(ev>0):
arr = np.random.randint(10, size=(m,n))
ev = np.linalg.eigvals(arr)
return arr, ev
首先我定义了低于 0 的虚拟特征值。然后我创建一个新数组并计算它的特征值。如果存在负特征值 ( while not all(ev>0)
),则创建一个新特征值。
推荐阅读
- javascript - 如何从 tinymce 5 中的工具栏菜单按钮项更改文本?
- reactjs - tsdoc-param-tag-with-invalid-name:@param 块后面应该跟一个有效的参数名称(TypeScript ESLint 和 React)
- spring - 嵌套异常是 java.lang.NumberFormatException: For input string: "editsave"] in spring MVC
- java - spring依赖注入,子项目提供接口实现
- css - 相同的 CSS,相同的页面,不同的渲染
- dropbox - 如何通过共享链接 URL 在 Dropbox API 中获取文件夹 lower_path?
- android-studio - Flutter 不在 android studio 列表中
- java - 无法将 Microsoft SQL Server 连接到 Spring Boot 应用程序
- python - 如何使用pyspark仅对spark数据框中的一列进行排序?
- wordpress - htaccess to web.config for wordpress & codeigniter