Лучший способ повернуть трехмерную сетку (nxnxn) значений в Python с интерполяцией? - PullRequest
0 голосов
/ 11 января 2020

Если у меня есть сетка значений nxnxn, скажем, 32x32x32, и я хочу повернуть эту сетку значений куба на некоторый угол поворота по осям x, y или z и интерполировать пропущенные значения, что будет лучшим способ go об этом без использования каких-либо существующих алгоритмов из пакетов (таких как Scipy)?

Я знаком с применением 3D-матрицы поворота к 3D-сетке точек, когда она представлена ​​в виде [n, 3] матрицы, но я не уверен, как go о применении поворота, когда представление дается в его трехмерной форме как nxnxn.

Я обнаружил предыдущий пост переполнения стека об этой топике c, но он использует три цикла for для своего подхода, который на самом деле не масштабируется с точки зрения скорости. Есть ли более векторизованный подход, который может выполнить sh подобную задачу?

Заранее спасибо!

1 Ответ

1 голос
/ 12 января 2020

Один из возможных вариантов выглядел бы так:

  1. изменить форму матрицы nxnxn на массив, содержащий n-мерные точки
  2. применить вращение к этому массиву
  3. изменить массив обратно в nxnxn

Вот код:

import numpy as np

#just a way to create some nxnxn matrix
n = 4
a = np.arange(n)
b = np.array([a]*n)
mat = np.array([b]*n)

#creating an array containg n-dimensional points
flat_mat = mat.reshape((int(mat.size/n),n))

#just a random matrix we will use as a rotation
rot = np.eye(n) + 2

#apply the rotation on each n-dimensional point
result = np.array([rot.dot(x) for x in flat_mat])
#return to original shape
result=result.reshape((n,n,n))
print(result)
...