2017-01-25 6 views
3

У меня есть массив numpy, который представляет собой трехмерную сетку по объему пространства, причем каждая ячейка представляет некубический воксел (масштабирование произвольно во всех трех измерениях). Массив - O (500) вокселей на размер.Самый быстрый способ заполнить массив numpy с расстояниями от точки

Я хотел бы заполнить этот массив расстоянием от заданной точки XYZ до центра каждого воксела.

Я могу заполнить массив, используя python for -loops, но это медленнее, чем хотелось бы. Есть ли способ сделать это быстро, используя numpy/scipy?

Преобразование в координаты XYZ выполняется с двумя кортежами, один из которых дает координаты XYZ центра вокселя 0,0,0, а другой - размер вокселей в единицах 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

Вы можете создать три одномерных массива, представляющих сплющенные координаты X, Y и Z вашего 3D-массива.

Затем выполнить вычисление гипотенузы для целых массивов, используя 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

Смежные вопросы