эффективная замена множества подмассивов 2-мерного массива в numpy на больших наборах данных - PullRequest
0 голосов
/ 06 мая 2020

Есть способ его ускорить? занимает слишком много времени на действительно больших наборах данных ... "матрица" - это список numpy массивов без solid длины (некоторые могут быть на 1-5 элементов длиннее или короче)

    def replaceScaleBelowZero(arr):  
        if np.amax(arr)<=0:
            arr[arr<=0] = minmax_scale(arr[arr<=0],(min_thresh*0.75,min_thresh)) 
        elif np.min(arr)<=0:
            arr[arr<=0] = minmax_scale(arr[arr<=0],(min_thresh*0.75,min_thresh)) 
        return arr 
    def replaceScaleBelowMinThresh(arr):  
       if np.amax(arr)<min_thresh:
           arr[arr<sl_thresh] = minmax_scale(arr[arr<min_thresh],(min_thresh*0.75,min_thresh)) 
       elif np.min(arr)<min_thresh:  
           arr[arr<min_thresh] = minmax_scale(arr[arr<min_thresh],(min_thresh*0.75,min_thresh)) 
       return arr 

    matrice = [replaceScaleBelowZero(slice_  ) for slice_ in matrice ] 
    matrice = [replaceScaleBelowMinThresh(slice_ ) for slice_ in matrice ]

1 Ответ

0 голосов
/ 06 мая 2020

sklearn.preprocessing.minmax_scale используйте много проверок. Если вы перепишете свой

arr[arr<=0] = minmax_scale(arr[arr<=0],(min_thresh*0.75,min_thresh))

как

a = arr[arra<=0]
a -= a.min()
a /= a.max()
a *= (0.25 * min_thresh)
a += 0.75 * min_thresh

(при условии, что arr равен 1d), это должно быть быстрее. Если это сработает, я думаю, его можно оптимизировать дальше, переписав это - =, / =, * =, + = всего двумя такими операциями.

Во второй функции вы используете

arr[arr<sl_thresh] = minmax_scale(arr[arr<min_thresh] ...

if sl_thresh != min_thresh это может привести к ошибкам. Если sl_thresh = min_thresh, я думаю, вы можете отказаться от предложения if-else, так как ваш ValueError, вероятно, был вызван sklearn.

...