【问题标题】:More efficient solution? Dictionary as sparse vector更有效的解决方案?字典作为稀疏向量
【发布时间】:2015-05-23 10:05:01
【问题描述】:

我有两个字典用作稀疏向量:

dict1 = {'a': 1, 'b': 4}
dict2 = {'a': 2, 'c': 2}

我编写了自己的 __add__ 函数来获得这个想要的结果:

dict1 = {'a': 3, 'b': 4, 'c': 2}

重要的是我知道每个对应值的字符串“a”、“b”和“c”。仅仅确保我添加了正确的尺寸是不够的。我还将获得更多以前未知的字符串,其中包含一些我现在刚刚添加到我的字典中的值。

现在我的问题是:那里有更高效的数据结构吗?我查看了 Numpy 的数组和 Scipy 的稀疏矩阵,但据我所知,它们在这里没有任何帮助,或者我只是没有看到解决方案?

我可以将键和值保存在单独的数组中,但我认为我不能只使用任何现有的函数来获得所需的结果。

dict1_keys   = np.array([a, b])
dict1_values = np.array([1, 4])
dict2_keys   = np.array([a, c])
dict2_values = np.array([2, 2])

# is there anything that will efficiently produce the following?
dict1_keys   = np.array([a, b, c])
dict1_values = np.array([3, 4, 2])

【问题讨论】:

  • 你真的需要你的键是字符串吗?您是否有已知数量的键或者您想要处理任何可能键的合并/添加?
  • 在 scikti-learn 中查看 the stuff。我没有这种事情的经验,但我认为它可以做你想做的事。
  • 它必须是字符串。我当然可以将字符串映射到数字,但我认为这不会加快任何速度。是的,稍后会添加更多键
  • 稀疏的dok 格式是一个字典,但它的键是一个元组 - 矩阵的 2 个整数索引值。要进行数学运算,它会转换为 csr 格式。

标签: python performance numpy scipy sparse-matrix


【解决方案1】:

也许pandas 就是你要找的东西:

d1 = pandas.DataFrame(numpy.array([1, 4]), index=['a', 'b'], dtype="int32")
d2 = pandas.DataFrame(numpy.array([2, 2]), index=['a', 'c'], dtype="int32")

d1.add(d2, fill_value=0)

结果:

   0
a  3
b  4
c  2

【讨论】:

  • 这正是我想要的!谢谢
【解决方案2】:

@sirfz 的Pandas approach 可能是使用熊猫Series 的单线:

>>> pd.Series(dict1).add(pd.Series(dict2), fill_value=0)
a    3.0
b    4.0
c    2.0

或者如果您的 API 需要 dicts

>>> dict(pd.Series(dict1).add(pd.Series(dict2), fill_value=0))
{'a': 3.0, 'b': 4.0, 'c': 2.0}

另外,这应该处理dicts 或Seriess 甚至scipy 稀疏矩阵行和sklearn Vectorizer 输出(稀疏向量/映射)的混合输入

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 2021-05-06
    • 2014-08-24
    • 2015-07-18
    • 2014-05-24
    • 2018-10-07
    • 2017-12-12
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多