我已经学习了一段时间的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分钟来进行计算。
有没有更好的方法来实现这个?
答案 0 :(得分:0)
使用numpy
。使用正确,所有循环工作都将在C空间中进行(因为numpy是C扩展),而不是慢速python-space循环,并且在许多情况下也会使程序更短且更易读(尽管它也非常容易用numpy编写不可读的代码。
numpy
是一个非常强大的工具,可以在你的python工具箱中使用,但期望学习曲线。
此外:
range(0, totalcols)
可以简单地写为range(totalcols)
。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}}
我没有真实的数据来正确测试它,但数据形状似乎有效。
我建议首先使用小密集(非稀疏)数组,然后使用小稀疏数组,然后再处理大尺寸数据。