用点距离填充numpy数组的最快方法

时间:2017-01-25 20:01:52

标签: python performance numpy scipy

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

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

我可以使用python for - 循环填充数组,但这比我想要的要慢。有没有办法快速使用numpy / scipy?

转换为XYZ坐标是通过两个元组完成的,一个给出0,0,0体素中心的XYZ坐标,另一个给出XYZ单位体素的大小。

2 个答案:

答案 0 :(得分:3)

使用每个维度中的距离创建一个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 :(得分:2)

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

然后使用numpy方法对整个数组执行hypothenuse计算:

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

最后,您将阵列重塑为原始形状。

相关问题