我有一個numpy數組,代表一個空間體積上的3d網格,每個單元表示一個非立方體素(縮放在所有三維中都是任意的)。該陣列是每個維度O(500)個體素。填充numpy數組與點距離的最快方法
我想用給定的XYZ點到每個體素中心的距離填充該數組。
我可以通過使用python for
-loops來填充數組,但這比我想要的要慢。有沒有辦法快速使用numpy/scipy來做到這一點?
使用兩個元組完成對XYZ座標的轉換,一個元素給出體素的中心的XYZ座標,另一個給出XYZ單元中體素的大小。
我有一個numpy數組,代表一個空間體積上的3d網格,每個單元表示一個非立方體素(縮放在所有三維中都是任意的)。該陣列是每個維度O(500)個體素。填充numpy數組與點距離的最快方法
我想用給定的XYZ點到每個體素中心的距離填充該數組。
我可以通過使用python for
-loops來填充數組,但這比我想要的要慢。有沒有辦法快速使用numpy/scipy來做到這一點?
使用兩個元組完成對XYZ座標的轉換,一個元素給出體素的中心的XYZ座標,另一個給出XYZ單元中體素的大小。
創建在每個維度的距離的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)
您可以創建三個一維數組,代表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))
在結束時,你重塑陣列到原來的形狀。
爲什麼不使用'np.square(x)'而不是'np.power(x,2)'? – MSeifert