Отображение 3-мерной координаты в 1-мерный индекс - PullRequest
1 голос
/ 25 апреля 2011

У меня есть трехмерная координата. Я хотел бы сопоставить его с одномерным индексом. Как я понимаю, для двумерного случая можно использовать функцию сопряжения. Тем не менее, я придумал следующую наивную реализацию для трехмерного случая:

from numpy import *

# the size of the coordinate space
xn = 100
yn = 100
zn = 100

# make a 3 dimensional matrix of zeros
m = zeros((xn,yn,zn))

def xyz_to_index(m,x,y,z):
    # set a particular coordinate to 1
    m[x,y,z] = 1
    # find its index
    i = argmax(m)
    # rezero matrix
    m[x,y,z] = 0
    # return 1D index
    return i

Этот код позволяет мне отобразить трехмерную точку на одномерный индекс, как показывает следующий журнал ipython:

In [40]: xyz_to_index(m,34,56,2)
Out[40]: 345602

Итак, теперь мой вопрос: есть ли лучший способ сделать это? Я полагаю, что обход матрицы - не самый эффективный способ преобразования координат. Что бы вы сделали вместо этого?

Ответы [ 3 ]

2 голосов
/ 25 апреля 2011

Вы можете реализовать функцию ravel_index() для массивов NumPy произвольного измерения:

def ravel_index(x, dims):
    i = 0
    for dim, j in zip(dims, x):
        i *= dim
        i += j
    return i

Эта функция является обратной к функции numpy.unravel_index().

Для вашего приложения вы можете вызвать эту функцию как ravel_index((x, y, z), m.shape).

2 голосов
/ 25 апреля 2011

Здесь представлено общее решение:

Одиночное взаимопревращение между многомерным и линейным индексированием

но в основном, если вы знаете форму вашего многомерного пространства:

def ravel_index(x, dims):
    c = np.cumprod([1] + dims[::-1])[:-1][::-1]
    return np.dot(c,x)


s = [100,100,100] # shape of dims
ii = [34,56,2] # 3d index
jj = ravel_index(ii,s) # 1d index
1 голос
/ 25 апреля 2011

Если вы заранее знаете, что все координаты находятся в диапазоне 0 ... 99, вы можете легко рассчитать индекс с помощью следующей функции:

def xyz_to_index(x,y,z):
    return ((x * 100) + y) * 100 + z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...