Python中列表列表的操作 - Scipy

时间:2013-10-08 04:27:41

标签: scipy

我已经学习了一段时间的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

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

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

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

2 个答案:

答案 0 :(得分:0)

使用numpy。使用正确,所有循环工作都将在C空间中进行(因为numpy是C扩展),而不是慢速python-space循环,并且在许多情况下也会使程序更短且更易读(尽管它也非常容易用numpy编写不可读的代码。

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

此外:

  1. range(0, totalcols)可以简单地写为range(totalcols)
  2. dw[i_i] = dw[i_i] + x => dw[i_i] += x

答案 1 :(得分:0)

您需要对dw计算进行矢量化。假设data_mat[j, totalcols]真的是data_mat,请使用prob的最后一列,(500,1)dw = (data_mat.multiply(data_mat[:,-1]-prob)).sum(axis=0) 数组(必要时重新整形),以下内容应该有效:

{{1}}

我没有真实的数据来正确测试它,但数据形状似乎有效。

我建议首先使用小密集(非稀疏)数组,然后使用小稀疏数组,然后再处理大尺寸数据。