微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用存储在python中多个矩阵中的数据创建和求解线性方程组的不同组合

如何解决使用存储在python中多个矩阵中的数据创建和求解线性方程组的不同组合

我想举一个简单的例子来说明我想做的事情。 我有一些在此步骤之前计算并存储在矩阵中的数据。在这个简单的例子中,我们只取两个 2x2 矩阵。它们可能看起来像这样:

A1=np.array([[1,2],[0.5,1.5]])


A2=np.array([[0.5,1.2],[1.3,2]])

我还有解向量 b,它可能看起来像:

b=[4,3]

现在我想解决线性方程组 Ax=b 的所有可能组合,这些组合可以从存储在矩阵 A1 和 A2 中的数据中创建。在两个矩阵中,列的数据相互连接。因此,从我的示例中可能求解的线性方程组如下所示:

LES1:

1 * x1 + 0.5 * x2 = 4

0.5 * x1 + 1.3 * x2 = 3

LES2:

1 * x1 + 1.2 * x2 = 4

0.5 * x1 + 2 * x2 = 3

LES3:

2 * x1 + 0.5 * x2 = 4

1.5 * x1 + 1.3 * x2 = 3

LES4:

2 * x1 + 1.2 * x2 = 4

1.5 * x1 + 2 * x2 = 3

通过使用 np.linalg.solve(Ax,b),我得到了四组 x1x2 值,这些值将在下一步中进行评估,以找到符合特定要求的输入数据的最佳组合。我知道我可以使用嵌套 for 循环对输入数组 A1A2 进行切片以创建线性方程组 LES1 到 LES4 并一个一个地求解它们来解决这个问题。

但在我的实际应用中,我需要处理比本例中更多的数据,这意味着我有两个以上的矩阵,而且它们也更大,这将创建更多可能的线性方程组组合,需要求解。

如果有人能给我一个提示解决这个问题而不使用 for 循环来跳过矩阵的列,我会非常高兴。或者也许有一种可能的方式以有效的方式使用 for 循环?

先谢谢大家

大卫

更新:

Mihails 的回答完美地解决了我所描述的问题。但是,在使用我的“现实生活数据”时,发生了两个问题,很遗憾,我在我的问题和所描述的示例中没有考虑到这些问题。

  1. 矩阵的形状并不总是相同的。尽管所有矩阵的行数相同,但列数各不相同。例如:
A1=np.array([[4,2,3,5,4],[1,0.5,1],[2,4,2]])
A2=np.array([[4,[8,8,9]])
A3=np.array([[4,[5,6,5],7]])

我仍然想找到我实际问题中提到的线性方程组的所有组合。有什么方法可以使给定的解决方案适应此任务?我试图通过阅读 itertools 文档来解决这个问题,但我无法弄清楚,因为无法像在创建数组 A 时所做的那样使用这些数据创建数组数组。并且将它们组合在一个列表中会给我带来与 i 迭代的问题。

  1. 处理数据后,我需要知道哪个输入数据集最适合我的要求。表示哪种列组合可提供最佳结果。由于列中的值是在较早的步骤中根据某些测量数据计算得出的,因此我想保留它们所基于的测量数据的名称(可以从较早的步骤中的数据中提取)。我知道在使用 pd.DataFrame 进行存储时我可以给出列名,但我不确定它们是否可以用于执行我要求的任务。 再次感谢您,并为显然是基本的“迷你示例”而感到抱歉

解决方法

一种优雅而简单的方法是使用 itertools.product 来避免硬编码循环。它需要多个列表并计算笛卡尔积。在下面,您可以看到它如何计算任意数量的列的组合。

在性能方面,zipproduct 使用生成器,因此它们不会直接填充您的内存,而是动态生成每个元素。

另一方面,如果您需要计算非常大量的数据,您可以考虑将负载分配给多个内核/机器。

import numpy as np
from itertools import product

A1=np.array([[1,2],[0.5,1.5]])
A2=np.array([[0.5,1.2],[1.3,2]])
A = np.array([A1,A2])
b=[4,3]

combine_ith_column = lambda A,i: product(*A[:,i])
combine_all_columns = lambda A: [combine_ith_column(A,i) for i in range(A.shape[1])]
A_space = zip(*combine_all_columns(A))

for Ax in A_space:
    print (np.linalg.solve(Ax,b))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。