Как интерполировать 5-мерный массив? - PullRequest
1 голос
/ 30 января 2020

У меня есть массив формы - [41, 101, 6, 4, 280]. Я хочу интерполировать его так, чтобы, если бы я дал ему значение из 41 значения температуры и 101 плотности, он выплевывал массив [6,4,280] формы. Есть ли функция NumPy, которая может справиться с этим?

1 Ответ

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

давайте начнем шаг за шагом:

Q : Существует ли функция NumPy , которая может справиться с этим?

Да, есть.

Первый шаг - создать экземпляр 5D numpy.ndarray, который будет содержать ваши известные точки данных. (не обращайте внимания на dtype, который использовался только для напоминания, что мы можем go буквально от битов до complex128 значений здесь, если потребуется позже):

>>> import numpy as np
>>>
>>> a5Dtensor = np.ndarray( (41, 101, 6, 4, 280 ), dtype = np.uint8 )

Теперь давайте проверим, что это .shape:

>>> a5Dtensor.shape
(41, 101, 6, 4, 280)

Основной трюк - встроенный умный numpy -slicing:

>>> a5Dtensor[0,0,:,:,:].shape
(6, 4, 280)

Это действительно возвращает запрошенный 3D-куб точек данных.
Трюк среза также очень умен в том, чтобы не производить никаких новых выделений памяти (что будет интересно, когда размеры вырастут где-то за пределы горизонтов L1 / L2 / L3-CPU-кэша, тем более один раз Вы получаете больше нескольких ГБ данных)

>>> a5Dtensor[0,0,:,:,:].flags
  C_CONTIGUOUS    : True
  F_CONTIGUOUS    : False <------ may enjoy FORTRAN efficient data layout, where needed
  OWNDATA         : False <------ 3D-cube data not "copied", rather "viewed" inside 5D
  WRITEABLE       : True
  ALIGNED         : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY    : False

И последнее, но не менее важное, если aTemperatureVALUE и aDensityVALUE переменные не являются индексами в 5D, а скорее значения данных, среди которых вы ищете искомую для интерполяции значений точек данных 3D-куба, numpy может служить с кусочно-линейной интерполяцией (с некоторыми ограничениями), все же делая любую такую ​​интерполяцию для каждого из результатов (в 3D-кубе интерполированных значений) требует, чтобы 2D-интерполяция выполнялась для каждой из координат 3D-куба на основе значений, хранящихся для ближайших { lower, upper } значений температуры и плотности, присутствующих в исходных 5D-данных -points.

Для этого есть другие умные инструменты в numpy (nD; n = 0+ .meshgrid() метод, .argwhere() и другие), но для этого может потребоваться косвенная индексация (предварительная сортировка), в случае, если исходные точки данных 5D не обладают некоторыми свойствами, такими как 3D кубы точки данных, уже предварительно отсортированные в первых двух измерениях, для облегчения обработки для искомого 2D- (темп, плотность) -интерполятора (будь то специально для * 1052) *, float64, complex128 или object).

...