我有以下问题:
我有一个距离矩阵与形状(41,79,181)和20000次迭代,其中计算矩阵的小方框,主要是形状(31,15,33)。现在我想对它们应用线性函数,将这些距离转换为其他数字。计算必须尽可能快。我尝试了两件事:
现在我想知道是否有更快的方法。在下面我使用的代码。第一种方法已经过时了,因为它似乎更慢。第二种方法是在这个相同速度的例子中,因为我不知道如何创建一个随机数的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距离变换计算距离矩阵。也许可以将它与我的转换一步合并?