- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有维数约为 200.000 的稀疏向量。我还有一个矩阵,其列数和行数与向量数相同。我想以增量方式将所有这些设置为矩阵,也就是说,第一个向量应该设置为第一行,依此类推。
目前,矩阵和向量的类型是 scipy.sparse.lil_matrix。使用以下函数将向量设置为矩阵的特定行:
In [7]: us.get_utterance_representation('here is a sentence')
Out[7]:
<1x188796 sparse matrix of type '<type 'numpy.float64'>'
with 22489 stored elements in Compressed Sparse Row format>
def set_row_vector(self, row, rowvector):
self.matrix[row] = rowvector[0]
for row, utterance in enumerate(utterances):
uvector = self.get_utterance_representation(utterance)
self.utterancematrix.add_row_vector(row, uvector)
其中 uvector 是维度为 1x~200.000 的 lil_matrix。
事实证明,以这种方式创建矩阵非常低效,其中一个文本字符串(话语)最多需要 5 秒。查看分析,我得出的结论是将向量设置为矩阵中的一行是主要问题。
55 def set_row_vector(self, row, rowvector):
2564609 function calls (2564606 primitive calls) in 5.046 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
22489 1.397 0.000 1.397 0.000 {numpy.core.multiarray.where}
22489 0.783 0.000 2.188 0.000 csr.py:281(_get_single_element)
44978 0.365 0.000 0.916 0.000 stride_tricks.py:35(broadcast_arrays)
44978 0.258 0.000 0.413 0.000 stride_tricks.py:22(as_strided)
202490 0.244 0.000 0.244 0.000 {numpy.core.multiarray.array}
22489 0.199 0.000 2.221 0.000 lil.py:280(__setitem__)
44978 0.174 0.000 0.399 0.000 sputils.py:171(_unpack_index)
584777 0.171 0.000 0.171 0.000 {isinstance}
44988 0.170 0.000 0.230 0.000 sputils.py:115(isintlike)
67467 0.166 0.000 0.278 0.000 sputils.py:196(_check_boolean)
22489 0.154 0.000 0.647 0.000 sputils.py:215(_index_to_arrays)
1 0.129 0.129 5.035 5.035 dsm_classes.py:55(set_row_vector)
22489 0.120 0.000 0.171 0.000 lil.py:247(_insertat2)
67467 0.102 0.000 0.102 0.000 {method 'ravel' of 'numpy.ndarray' objects}
我的问题是,有没有更好的方法来完成从话语中创建矩阵?
(谢谢)
最佳答案
首先,我认为您的 uvector
实际上是 CSR 格式,而不是 LIL。然而,这可能是最好的:
In [30]: import scipy.sparse as ss
In [31]: row = ss.rand(1,5000,0.1,'csr')
In [32]: matrix = ss.lil_matrix((30,5000))
In [33]: %timeit matrix[0] = row
10 loops, best of 3: 65.6 ms per loop
In [34]: row_lil = row.tolil()
In [35]: %timeit matrix[0] = row_lil
10 loops, best of 3: 93.4 ms per loop
接下来,您可以通过删除 rowvector
上的 [0]
下标来避免一些开销:
In [38]: %timeit matrix[0] = row[0]
10 loops, best of 3: 104 ms per loop
In [39]: %timeit matrix[0] = row
10 loops, best of 3: 68.7 ms per loop
最后,解决方案的核心是尽可能避免使用 LIL 格式。虽然它是最灵活的格式,但也是最慢的(通常)。例如,如果您只想一次构建一行矩阵,则可以使用 scipy.sparse.vstack
:
In [40]: %%timeit
....: for i in xrange(matrix.shape[0]):
....: matrix[i] = row
....:
1 loops, best of 3: 3.14 s per loop
In [41]: %timeit ss.vstack([row for i in xrange(matrix.shape[0])])
1000 loops, best of 3: 1.46 ms per loop
In [44]: m2 = ss.vstack([row for i in xrange(matrix.shape[0])])
In [45]: numpy.allclose(matrix.todense(), m2.todense())
Out[45]: True
编辑:如果内存是一个问题并且您仍然想要最大速度,您可以根据fast vstack
for CSR matrices 创建自己的vstack
.我将从复制 _compressed_sparse_stack
函数开始,并使用您的 CSR 行列表和 axis = 0
调用它。然后,您应该能够修改它以采用迭代器而不是列表,这将避免高内存开销。或者,您可以将这些步骤内联到您的 for 循环中。无论哪种方式,您都会损失一点速度,但可能会节省大量内存。
关于python - 在 SciPy sparse.lil_matrix 中有效地设置行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21462214/
这是我要做的事情的一个例子: my_rows = [[1, 3], [0, 2], [], [1]] my_data = [[1,1], [1,1], [],[1]] 我想创建一个像这样的矩阵: im
如何快速提取 scipy.sparse.lil_matrix 的两行并对它们应用按位运算?我试过: np.bitwise_and(A[1,:], A[2,:]) 但根据文档,NumPy 似乎需要数组类
我使用稀疏 lil_matrix 格式存储具有两种类型关系的图形。这就是我正在做的: e=15 k= 2 X = [lil_matrix((e,e)) for i in range(k)] #stor
我想将我的稀疏 scipy.lil_matrix 矩阵除以向量并再次获得稀疏矩阵。假设我有 2 个 lil_matrix 变量和 2 个 numpy 数组 a, b, c, d,像这样 In [1]:
我想逐步构建一个非常大的稀疏矩阵。问题是 lil_matrix 占用了太多 RAM,以至于效率低下。例如,如果我想创建一个 2000 万 x 2000 万的 lil_matrix,它会完全耗尽我的 R
我想从 scipy 稀疏矩阵中提取特定的行和列 - 可能 lil_matrix 将是这里的最佳选择。 它在这里工作正常: from scipy import sparse lilm=sparse.li
我有一个生成器,可以生成相同长度的单维 numpy.array 。我想要一个包含该数据的稀疏矩阵。行的生成顺序与我希望它们出现在最终矩阵中的顺序相同。 csr 矩阵优于 lil 矩阵,但我认为后者在我
在 Scipy 稀疏 lil_matrix 中找到最大值及其对应的行和列索引的最佳方法是什么?目的 ?我可以loop through the nonzero entries using itertoo
我有维数约为 200.000 的稀疏向量。我还有一个矩阵,其列数和行数与向量数相同。我想以增量方式将所有这些设置为矩阵,也就是说,第一个向量应该设置为第一行,依此类推。 目前,矩阵和向量的类型是 sc
我想迭代构建稀疏矩阵,并注意到根据 SciPy 文档有两个合适的选项: LiL matrix : class scipy.sparse.lil_matrix(arg1, shape=None, dty
我是一名优秀的程序员,十分优秀!