Я ищу быстрый способ взаимного преобразования между линейной и многомерной индексацией в Numpy.
Чтобы конкретизировать использование, у меня есть большая коллекция из N частиц, каждому из которых присвоены 5 значений с плавающей точкой (измерения), которые дают массив Nx5.Затем я помещаю в бин каждое измерение, используя numpy.digitize с соответствующим выбором границ бина, чтобы назначить каждой частице бин в 5-мерном пространстве.
N = 10
ndims = 5
p = numpy.random.normal(size=(N,ndims))
for idim in xrange(ndims):
bbnds[idim] = numpy.array([-float('inf')]+[-2.,-1.,0.,1.,2.]+[float('inf')])
binassign = ndims*[None]
for idim in xrange(ndims):
binassign[idim] = numpy.digitize(p[:,idim],bbnds[idim]) - 1
binassign содержит строки, соответствующие многомерному индексу.Если я затем захочу преобразовать многомерный индекс в линейный индекс, я думаю, что я хотел бы сделать что-то вроде:
linind = numpy.arange(6**5).reshape(6,6,6,6,6)
. Это дало бы поиск для каждого многомерного индекса, чтобы отобразить его в линейный индекс.индекс.Затем вы можете вернуться назад, используя:
mindx = numpy.unravel_index(x,linind.shape)
Там, где у меня возникли трудности, это выяснить, как получить binassign (массив Nx5), содержащий многомерный индекс в каждой строке, и покрыть его до 1d линейного индекса, используя его, чтобы разрезать линейный индексный массив linind.
Если у кого-то есть один (или несколько) трюк для индексации строк, позволяющий переключаться между многомерным индексом и линейным индексом таким образом, чтобы векторизовать операцию для всех N частиц, я был бы признателен за ваше понимание.