2

複数の大きなラベル付きの numpy 2d 配列 (10 000x10 000) があります。各ラベル (同じ番号の接続されたセル) について、別の numpy 3-d 配列の値 (平均、標準、最大など) に基づいて複数の測定値を計算したいと考えています。3-d numpy が 2-d に変換されている場合、これは scipy.ndimage.labeled_comprehension ツールで可能です。ただし、ラベルの数と配列のサイズがかなり大きいため、計算にはかなりの時間がかかります。入力画像の 3 次元ごとに同じラベルを反復処理しているため、現在のコードは冗長に見えます。コードを高速化する方法があるかどうか疑問に思っています (たとえば、3 つの scipy.ndimage.labeled_comprehension 計算を 1 つの計算に結合するなど)。

形状 (4200,3000,3) および 283047 ラベルのテスト データセットを使用すると、計算に 10:34 分かかりました


テストデータ

example_labels=np.array([[1, 1, 3, 3],
   [1, 2, 2, 3],
   [2, 2, 4, 4],
   [5, 5, 5, 4]])

unique_labels=np.unique(example_labels)
value_array=np.arange(48).reshape(4,4,3)

現在のコードと目的の出力

def mean_std_measurement(x):
    xmean = x.mean()
    xstd = x.std()
    vals.append([xmean,xstd])

def calculate_measurements(labels, unique_labels, value_arr):
    global vals
    vals=[]
    ndimage.labeled_comprehension(value_array[:,:,0],labels,unique_labels,mean_std_measurement,float,-1)
    val1=np.array(vals)
    vals=[]
    ndimage.labeled_comprehension(value_array[:,:,1],labels,unique_labels,mean_std_measurement,float,-1)
    val2=np.array(vals)
    vals=[]
    ndimage.labeled_comprehension(value_array[:,:,2],labels,unique_labels,mean_std_measurement,float,-1)
    val3=np.array(vals)
    return np.column_stack((unique_labels,val1,val2,val3))

>>> print calculate_measurements(example_labels,unique_labels,value_array)
array([[  1.        ,   5.        ,   5.09901951,   6.        ,
      5.09901951,   7.        ,   5.09901951],
   [  2.        ,  21.        ,   4.74341649,  22.        ,
      4.74341649,  23.        ,   4.74341649],
   [  3.        ,  12.        ,   6.4807407 ,  13.        ,
      6.4807407 ,  14.        ,   6.4807407 ],
   [  4.        ,  36.        ,   6.4807407 ,  37.        ,
      6.4807407 ,  38.        ,   6.4807407 ],
   [  5.        ,  39.        ,   2.44948974,  40.        ,
      2.44948974,  41.        ,   2.44948974]])
4

1 に答える 1