【发布时间】:2016-11-07 12:43:32
【问题描述】:
给定一个列表的列表,其中每个列表的长度
M = [[1,2,3,4,4,5,1,2,9,0], [3,2,1,0,5,6,2,4,6,7], [4,5,5,2,1,2,3,4,2,4], [7,5,6,2,6,7,8,8,8,1] ]
我想计算一个元素的重复次数并将其输入一个单独的矩阵。
我们将每个列表称为frame,将框架中的元素称为states。
这是我的代码,它工作正常:
import numpy as np
from collections import Counter
import numpy as np
from xarray import DataArray
def Vfinal(s_t,Matrix):
state_no = np.arange(0,s_t)
frame_no = np.arange(0,len(Matrix))
V= DataArray(np.zeros(( len(state_no),len(Matrix) )), coords=[('States_count', state_no), ('Frame',frame_no)])
for i,j in enumerate(Matrix):
for k in j:
print(k,i)
V.loc[k,i] +=1
return V
In [172]: V = Vfinal(10,M)
In [173]: V
Out[173]:
<xarray.DataArray (States_count: 10, Frame: 4)>
array([[ 1., 1., 0., 0.],
[ 2., 1., 1., 1.],
[ 2., 2., 3., 1.],
[ 1., 1., 1., 0.],
[ 2., 1., 3., 0.],
[ 1., 1., 2., 1.],
[ 0., 2., 0., 2.],
[ 0., 1., 0., 2.],
[ 0., 0., 0., 3.],
[ 1., 0., 0., 0.]])
Coordinates:
* States_count (States_count) int64 0 1 2 3 4 5 6 7 8 9
* Frame (Frame) int64 0 1 2 3
在我的例子中,M 列表有28,800 lists,其中每个列表包含 75 个元素(0 到 499 之间的数字)。
这使矩阵的大小为 500X 28,800。代码需要 30 分钟(大约)才能完成,我认为问题出在 for 循环中。
有没有什么高效的写法让代码执行得更快?
【问题讨论】:
-
能否请您从循环中删除
print(k,i)并重新计时。编写每次迭代通常需要太多时间 -
是的,我删除了,甚至需要更多时间。
-
没有
print会更慢?!?这是没有意义的。无论如何,我认为您的问题可能与 stackoverflow.com/questions/21394626/how-to-bin-a-matrix 重复,请检查那里的答案是否对您有帮助 -
不,它对我没有特别的帮助。
-
我用你提到的形状(28800x75)的随机生成的数据复制并尝试了你的代码,并且(没有打印)花了大约 3 秒,而我建议的问题中的方法花了大约 0.2 秒。你确定这是拖慢你的代码的部分吗?
标签: python python-3.x for-loop counter python-xarray