从一个点开始计算距离,填充numpy数组的最快方法

5
我有一个numpy数组,表示空间体积上的3D网格,每个单元格代表一个非立方体素(在所有三个维度上都是任意缩放的)。该数组在每个维度上具有O(500)个体素。
我想用给定的XYZ点到每个体素中心的距离来填充该数组。
我可以使用python的for循环来填充数组,但速度较慢。是否有一种使用numpy / scipy快速完成的方法?
将其转换为XYZ坐标需要两个元组,一个给出0,0,0体素中心的XYZ坐标,另一个给出体素在XYZ单位中的尺寸。
2个回答

7
创建一个包含每个维度距离的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)

2
你可以创建三个一维数组,表示你的3D数组的展平的X、Y和Z坐标。
然后使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接