让我们一步一步开始吧:
Q:有没有NumPy 函数可以解决这个问题?
是的,有。
第一步是生成一个 5D numpy.ndarray 的实例,它将包含您已知的数据点(不要介意 dtype,它只是用来提醒我们可以如果以后需要,从位到 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 缓存范围,这将是有趣的,一旦超过几 GB-of数据)
>>> 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 立方体中)需要基于原始 5D 数据点中存在的最接近-{ lower, upper } 温度和密度值的值,对每个 3D 立方体坐标运行 2D 插值。
在numpy(nD; n = 0+ .meshgrid() 方法,.argwhere() 和其他)中还有其他智能工具,但发现(预排序),可能需要间接索引,在如果原始 5D 数据点没有表现出某些属性,例如数据点的 3D 立方体已经在前两个维度中进行了预排序,以便于处理所寻求的 2D-(temp,密度)-插值器(专门为dtype=uint8、float64、complex128 或object 量身定制)。