【问题标题】:efficiently replacing many subarrays of 2d array in numpy on large datasets在大型数据集上有效地替换 numpy 中二维数组的许多子数组
【发布时间】:2020-08-20 21:59:47
【问题描述】:

有没有办法加快速度?在非常大的数据集上花费太长时间...... “矩阵”是一个没有固定长度的 numpy 数组列表(有些可能是 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 ]

【问题讨论】:

  • 在第一个函数中,您可以删除if-elif,只留下arr[arr &lt;= 0] = ...。以及minmax_scale() 是如何定义的?
  • @V.Ayrat minmax_scale() 是 sklearn 的 minmaxscaler“来自 sklearn.preprocessing import minmax_scale”。我尝试了“arr[arr

标签: arrays list performance numpy processing-efficiency


【解决方案1】:

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] ...

如果sl_thresh != min_thresh 这可能会出错。如果sl_thresh = min_thresh 我猜你可以放弃if-else 子句,因为你的ValueError 可能是由sklearn 提出的。

【讨论】:

  • 对不起,我不明白第二部分:“在你的第二个函数中,你使用 arr[arrsl_thresh != min_thresh 这可能会出错。如果sl_thresh = min_thresh 我想你可以放弃if-else 子句,因为你的ValueError 可能是由sklearn 提出的。”
  • 正确吗? . def minmax_scale_efficient(arr,newmin,newmax): a = arr[arr&lt;=0] a -= a.min() a /= a.max() a *= ((newmax-newmin) * min_thresh) a += newmin * min_thresh return a
  • 我的意思是,例如,如果a = np.arange(3); a[a &lt; 0] = a[a &lt; 2] 出现错误,因为左侧和右侧的大小不同。如果sl_thresh != min_thresh 可能会出错,则对您的代码也是如此。所以我猜sl_thresh应该在你的代码中改为min_thresh
  • 希望是正确的。但是你应该检查你的数据。并检查它是否真的更快。如果速度很重要,你最好在代码中嵌入minmax_scale_efficient,因为调用函数也需要一些时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2021-01-29
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
相关资源
最近更新 更多