2016-07-05 64 views
1

給定列表的列表,其中每個列表與長度Python:從列表列表中選擇元素數量並向Matrix提供數據?

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 

在我的案例列表M28,800 lists,其中每個列表包含75個元素(編號499 0之間)。

這使矩陣的大小爲500X 28,800。代碼需要30分鐘(約)完成,我相信問題在於for循環。

是否有任何有效的方式來編寫代碼,以便更快地執行代碼?

+0

可否請您從循環又一次它刪除'打印(K,I)'。編寫每個迭代通常需要很多時間 –

+0

是的,我刪除了,甚至需要更多時間。 – Rangooski

+0

沒有'print'就慢一點?!?這是沒有意義的。無論如何,我認爲你的問題可能是http://stackoverflow.com/questions/21394626/how-to-bin-a-matrix的副本,請檢查是否有幫助你的答案 –

回答

2

我將功能Vfinal更改爲Vfinal2

這使得代碼更快

def Vfinal2(s_t,Matrix): 
     V = np.zeros((s_t,len(Matrix))) 
     for i,row in enumerate(Matrix): 
      a = np.bincount(row) 
      b=np.zeros(s_t) 
      b[:len(a)]=a 
      V[:,i]=b 
    return V