2017-01-25 59 views
3

我有一个numpy数组,代表一个空间体积上的3d网格,每个单元表示一个非立方体素(缩放在所有三维中都是任意的)。该阵列是每个维度O(500)个体素。填充numpy数组与点距离的最快方法

我想用给定的XYZ点到每个体素中心的距离填充该数组。

我可以通过使用python for -loops来填充数组,但这比我想要的要慢。有没有办法快速使用numpy/scipy来做到这一点?

使用两个元组完成对XYZ坐标的转换,一个元素给出体素的中心的XYZ坐标,另一个给出XYZ单元中体素的大小。

回答

2

创建在每个维度的距离的ogrid,然后计算距离(使用该ogrid结果正常播出):

import numpy as np 

x0, y0, z0 = 10, 10, 10 

# assuming each dimension includes 500 points, from 0 to 500, step 1 
x, y, z = np.ogrid[0:500, 0:500, 0:500] 
distances = np.sqrt((x-x0)**2+(y-y0)**2+(z-z0)**2) 

如果您需要包括一些缩放和网格偏移:

x, y, z = np.ogrid[0:500, 0:500, 0:500] 
x, y, z = (x * scale_x + offset_x, 
      y * scale_y + offset_y, 
      z * scale_z + offset_z) 
distances = np.sqrt((x-x0)**2+(y-y0)**2+(z-z0)**2) 
1

您可以创建三个一维数组,代表3D数组的平展X,Y和Z坐标。

然后在执行hypothenuse计算对于整个阵列,使用numpy的方法:

D = numpy.sqrt(numpy.power(X - x_center, 2) + 
       numpy.power(Y - y_center, 2) + 
       numpy.power(Z - z_center, 2)) 

在结束时,你重塑阵列到原来的形状。

+1

为什么不使用'np.square(x)'而不是'np.power(x,2)'? – MSeifert