Python:将函数映射到矩阵

时间:2018-02-15 20:31:42

标签: python arrays numpy scipy

我有以下问题:

我有一个距离矩阵与形状(41,79,181)和20000次迭代,其中计算矩阵的小方框,主要是形状(31,15,33)。现在我想对它们应用线性函数,将这些距离转换为其他数字。计算必须尽可能快。我尝试了两件事:

  1. 创建线性函数并使用numpy对其进行矢量化以将其应用于矩阵。这对我来说似乎很慢。
  2. 使用np.unique获取所有不同的可用距离并将其掩盖在矩阵上,对我来说更快,因为大多数时间只有400-500个不同的距离。
  3. 现在我想知道是否有更快的方法。在下面我使用的代码。第一种方法已经过时了,因为它似乎更慢。第二种方法是在这个相同速度的例子中,因为我不知道如何创建一个随机数的3d数组,其中只有400-500个不同的数字出现:

    import numpy as np
    
    
    def linearCalc(x,radius,frc_size,cellScoring,frcScoring,sH,sMin):        
        if x > radius+frc_size:
            return 0.0
        elif x<= radius:
            if cellScoring==1: 
                points = [(0,-sH),(radius,-sMin)]
                x_coords, y_coords = zip(*points)
                A = np.vstack([x_coords,np.ones(len(x_coords))]).T
                m, c = np.linalg.lstsq(A, y_coords)[0]
                return m*x+c
    
    vfunc = np.vectorize(linearCalc)
    minX=10 
    maxX=47 
    minY=64
    maxY= 89 
    minZ= 22 
    maxZ= 55                    
    radius=2
    fcr_size=4
    cellScoring=1
    frcScoring=1
    sH=15
    sMin=1
    
    
    TemporalMatrix = np.random.rand(41, 79, 181)
        ####### 1. Method ##########
    """    
    for t in range(0,20000):
        print('cell:',t)
        eucledanBox2= np.zeros(TemporalMatrix.shape)
        distanceValues = np.unique(TemporalMatrix[minX:maxX,minY:maxY,minZ:maxZ])
        eucledanBox2[minX:maxX,minY:maxY,minZ:maxZ] = vfunc(TemporalMatrix[minX:maxX,minY:maxY,minZ:maxZ],radius,fcr_size,1,1,15,1)
    
    """
         ####### 2. Method ##########   
    for t in range(0,20000):
        print('cell:',t) 
        eucledanBox2= np.zeros(TemporalMatrix.shape)
        distanceValues = np.unique(TemporalMatrix[minX:maxX,minY:maxY,minZ:maxZ])
        for i in distanceValues:
            eucledanBox2[minX:maxX,minY:maxY,minZ:maxZ][TemporalMatrix[minX:maxX,minY:maxY,minZ:maxZ] == i] = linearCalc(i,radius,fcr_size,cellScoring,frcScoring,sH,sMin)
    

    有更快的方法吗?最好的问候!

    修改

    通过scipys ndimage.distance_transform_edt通过eucledean距离变换计算距离矩阵。也许可以将它与我的转换一步合并?

0 个答案:

没有答案