为了账号安全,请及时绑定邮箱和手机立即绑定

Python中计数器的线性组合

Python中计数器的线性组合

芜湖不芜 2021-09-11 15:44:39
我有一些像下面这样的 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.0112A*15.999 = W*15.999我预计此操作将涉及将 Counter 字典转换为矩阵以求解线性方程组,但我对如何执行此操作感到困惑。
查看完整描述

1 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

这是一个非常符合您方法的解决方案。


将每个 Counter 转换为向量,将不同的 ID 视为单独的维度。

求解线性方程组。

from collections import Counter

import numpy as np

from scipy import linalg



lhs = (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 dimension

ks = np.array([*set().union(rhs, *lhs)])[:, None]


# get a helper function to convert Counters to vectors

ctr_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 problem

coefs = linalg.lstsq(lhs_mat, rhs_vec)[0]


is_linear_comb = np.allclose(lhs_mat @ coefs, rhs_vec)


查看完整回答
反对 回复 2021-09-11
  • 1 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信