Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中解压和乘法稀疏数组的有效方法_Python_Arrays_Numpy_Scipy_Sparse Matrix - Fatal编程技术网

python中解压和乘法稀疏数组的有效方法

python中解压和乘法稀疏数组的有效方法,python,arrays,numpy,scipy,sparse-matrix,Python,Arrays,Numpy,Scipy,Sparse Matrix,在数据库中,我有一个压缩的频率数组。第一个值表示完整数组索引,第二个值表示频率。这只压缩为非0值,因为它非常稀疏-小于5%的非0值。我试图解压这个数组,然后我需要这个数组的点积和一个权重数组,得到一个总权重。对于较大的阵列,这是非常低效的。有人有更有效的方法吗?例如,我是否应该使用scipy.sparse并保持compressedfreqs数组不变?或者,我是否应该做一个更有效的列表理解,而不是遍历每个项目 下面是我正在做的一个小例子: import numpy as np compresse

在数据库中,我有一个压缩的频率数组。第一个值表示完整数组索引,第二个值表示频率。这只压缩为非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