gpt4 book ai didi

python - python中稀疏数组解压乘法的高效方法

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:19 25 4
gpt4 key购买 nike

在数据库中我有一个压缩的频率数组。第一个值表示完整数组索引,第二个值表示频率。这被压缩为仅非 0 值,因为它非常稀疏 - 少于 5% 的非 0。我正在尝试解压缩数组,然后我需要这个数组的点积和一个权重数组来获得总权重。对于较大的阵列,这是非常低效的。有没有人有更有效的方法来做到这一点?例如,我是否应该使用 scipy.sparse 而只保留 compressedfreqs 数组?或者我应该做一个更有效的列表理解而不是循环遍历每个项目?

这是我正在做的一个小例子:

import numpy as np

compressedfreqs = [(1,4),(3,2),(9,8)]
weights = np.array([4,4,4,3,3,3,2,2,2,1])

freqs = np.array([0] * 10)
for item in compressedfreqs:
freqs[item[0]] = item[1]

totalweight = np.dot(freqs,weights)
print totalweight

最佳答案

您可以使用 scipy.sparse 为您处理所有这些:

>>> import scipy.sparse as sps
>>> cfq = np.array([(1,4),(3,2),(9,8)])
>>> cfq_sps = sps.coo_matrix((cfq[:,1], ([0]*len(cfq), cfq[:,0])))
>>> cfq_sps
<1x10 sparse matrix of type '<type 'numpy.int32'>'
with 3 stored elements in COOrdinate format>
>>> cfq_sps.A # convert to dense array
array([[0, 4, 0, 2, 0, 0, 0, 0, 0, 8]])
>>> weights = np.array([4,4,4,3,3,3,2,2,2,1])
>>> cfq_sps.dot(weights)
array([30])

如果你不想使用稀疏模块,你可以使用生成器表达式让它工作,尽管可能会更慢:

>>> sum(k*weights[j] for j,k in cfq)
30

关于python - python中稀疏数组解压乘法的高效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19666029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com