0

我学习 Python 已经有一段时间了,但 Scipy 是我正在尝试的新东西。所以,我在实现这个时遇到了困难:

我有这个代码,

data_mat = sparse.lil_matrix((500, 11000))

for i_i in range(0, totalcols):
    for j, data  in enumerate(data_mat):
        dw[i_i] = dw[i_i] + (data_mat[j, i_i] * (data_mat[j, totalcols] - prob[j]))

这里,

dw[totalcols]  #is a list containing 11000 entries initialized to 0

这段代码的作用是,它逐列遍历 data_mat ,对于每一列,它逐行获取值并进行一些计算。

例子:

1,0,o,...........,1,0,0
0,1,1,...........,0,1,1
.......................
.......................
1,0,0,............0,0,0

稀疏矩阵:500 X 11000 个条目的 data_mat

我能够做到这一点,但是,我的程序花费的时间太长了,比如超过 10 分钟来进行计算。

有没有更好的方法来实现这个?

4

2 回答 2

0

You need to vectorize the dw calculation. Assuming that by data_mat[j, totalcols] you really mean, use the last column of data_mat, and prob is a (500,1) array (reshape if necessary), the following should work:

dw = (data_mat.multiply(data_mat[:,-1]-prob)).sum(axis=0)

I don't have realistic data to properly test it, but the data shapes appear to work.

I'd suggest getting it working with small dense (not-sparse) arrays first, and then small sparse ones before working on the large size.

于 2013-10-12T04:29:25.617 回答
0

使用numpy. 使用得当,所有的循环工作都将发生在 C 空间中(因为 numpy 是 C 扩展),而不是缓慢的 python 空间循环,并且在许多情况下也会使程序更短且更具可读性(尽管它也非常用 numpy 编写不可读的代码很容易)。

numpy是一个非常强大的工具,可以在你的 python 工具箱中使用,但需要一个学习曲线。

还:

  1. range(0, totalcols)可以简单地写成range(totalcols)
  2. dw[i_i] = dw[i_i] + x=>dw[i_i] += x
于 2013-10-08T05:09:35.593 回答