猿问

Python中计数器的线性组合

我有一些像下面这样的 Counter 对象代表等式的左侧和右侧:


左手边: (Counter({22.99: 1}), Counter({12.011: 2, 15.999: 2}), Counter({12.011: 7}))


右侧: Counter({12.011: 15, 15.999: 1})


我的目标是找到等式两边的共同元素,然后确定可以给我右边的左边的线性组合。


在上面的例子中,要求解的方程是:


2A*12.011 + 7B*12.011 = 15W*12.011


2A*15.999 = W*15.999

我预计此操作将涉及将 Counter 字典转换为矩阵以求解线性方程组,但我对如何执行此操作感到困惑。


芜湖不芜
浏览 160回答 1
1回答

HUH函数

这是一个非常符合您方法的解决方案。将每个 Counter 转换为向量,将不同的 ID 视为单独的维度。求解线性方程组。from collections import Counterimport numpy as npfrom scipy import linalglhs = (Counter({22.99: 1}), Counter({12.011: 2, 15.999: 2}), Counter({12.011: 7}))rhs = Counter({12.011: 15, 15.999: 1})# get unique keys that occur in any Counter in 2D# each unique key represents a separate dimensionks = np.array([*set().union(rhs, *lhs)])[:, None]# get a helper function to convert Counters to vectorsctr_to_vec = np.vectorize(Counter.__getitem__)lhs_mat = ctr_to_vec(lhs, ks)rhs_vec = ctr_to_vec(rhs, ks)# compute coefficients solving the least-squares problemcoefs = linalg.lstsq(lhs_mat, rhs_vec)[0]is_linear_comb = np.allclose(lhs_mat @ coefs, rhs_vec)
随时随地看视频慕课网APP

相关分类

Python
我要回答