1

リストのリストが与えられた場合、各リストの長さは

 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

コードをより高速に実行できるように効率的に記述する方法はありますか?

4

1 に答える 1

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    
于 2016-07-06T08:10:51.943 に答える