давайте начнем шаг за шагом:
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
).