2016-07-05 1 views
1

Учитывая список список, где каждый список длиныPython: подсчитать количество элементов из списка списка и подать в матрицу?

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.

Есть ли эффективный способ записи, чтобы код мог быть выполнен быстрее?

+0

Можете ли вы удалить 'печать (к, я)' из цикла и времени его снова. Написание каждой итерации обычно занимает слишком много времени –

+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