- 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/
有人知道什么时候最好选择哪个吗?在我看来,它们是一样的... lsmr lsqr 最佳答案 两种软件包的功能相同。 LSMR基于2010年的Fong&Saunders算法(请参阅paper),并且最近
似乎 scipy.sparse.linalg 的迭代求解器不支持 scipy.sparse 的稀疏矩阵数据类型作为方程系统的右侧(而直接求解器会)。考虑以下简短示例: import numpy as
我有一个包含多个字符串列的数据框,我想将其转换为分类数据,以便我可以运行一些模型并从中提取重要特征。 但是,由于唯一值的数量,单热编码数据会扩展到大量列,从而导致性能问题。 为了解决这个问题,我正在试
我有一些需要每天同步的 VM 镜像。 VM 文件是稀疏的。 为了节省网络流量,我只想传输图像的真实数据。 我在 rsync 中使用 --sparse 选项进行尝试,但在网络流量上,我看到整个大小都通过
我有一些不明白的信息: Bigtable may be understood a sparse table. Most cells contain nullvalues - too sparse to
我一直在查看 Matlab 的 sparse documentation试图找出是否有任何指导方针来说明何时使用稀疏表示而不是完整表示是有意义的。 例如,我有一个包含大约 30% 非零条目的矩阵 da
当我尝试编译以下程序时,编译器提示 j 和 row 未声明,这让我感到惊讶,因为 Chapel - Ranges defined using bounds of type 'range(int(64)
我需要以某种方式在磁盘上存储一个 512^3 阵列,我目前使用的是 HDF5。由于阵列稀疏,因此浪费了大量磁盘空间。 HDF5 是否为稀疏数组提供任何支持? 最佳答案 一种解决方法是使用 compre
稀疏张量与自身或密集张量的乘法在 TensorFlow 中似乎不起作用。下面的例子 from __future__ import print_function import tensorflow as
我有一个git存储库,其中有一堆大型csv,我不想克隆,因此我遇到了git sparse-checkout和这篇文章:https://github.blog/2020-01-17-bring-your
是否有一种简单的方法可以按列贬低稀疏矩阵,同时将零值视为缺失(使用 Matrix 包)? 我似乎遇到两个问题: 找到合适的列意味着 空单元格被视为零而不是缺失: M0 或者@user20650评论
我在训练具有稀疏输入数据的神经网络以解决监督回归问题时遇到问题。当我对输入数据执行均值归一化(减去均值再除以标准差)时,我得到了很多NaN值。我想知道是否有人有处理此类问题的经验。缩放稀疏输入数据的正
在 Eigen 中编辑稀疏矩阵对角线的最快方法是什么?我已经使用三元组填充了它,但我偶尔需要更改所有对角线值(它们已经设置为非零值)。 最佳答案 如果可以接受,您可以简单地使用它们的索引,例如 sp_
我看到“稀疏”和“稀疏”的使用方式表明它可以提高模型的准确性。例如: I think the unsupervised phase might be not so important if some
MATLAB Coder 似乎很花哨,可以通过将代码转换为 C/C++ 或 MEX 来加快 MATLAB 代码的速度。但是它似乎不支持稀疏矩阵,或者 matlab 函数 sparse 这对我的代码至关
我有一个使用 scipy.sparse.linalg.gmres 求解稀疏线性系统的简单代码 W, S = load_data() M = normalize(W.T.astype('float64
我正在尝试创建一个大小为 n 的多维数组(其中 n 是符号形状张量的一部分)。该数组在每个区域中都应有 0,但很少有区域是变量 b_class。 这是一个简单的 Numpy 实现,但在这种情况下,我们
Java 7 defines this option ,但我不明白它的用处。考虑这个简单的程序,它在一台足够新的 Linux 机器上运行,带有 Java 6 JVM: public static vo
我有一个 CSR matrix : >> print type(tfidf) 我想对 CSR matrix 的两行进行点积: >> v1 = tfidf.getrow(1) >> v2 = tfid
尽管一切似乎都已矢量化,但以下代码运行速度太慢。 from numpy import * from scipy.sparse import * n = 100000; i = xrange(n); j
我是一名优秀的程序员,十分优秀!