【问题标题】:How to interpolate a 5 dimensional array?如何插入一个 5 维数组?
【发布时间】:2020-01-30 03:40:18
【问题描述】:

我有一个形状数组 - [41, 101, 6, 4, 280]。我想对它进行插值,这样如果我给它一个来自 41 个温度和 101 个密度值的值,它会吐出一个 [6,4,280] 形状的数组。有没有可以处理这个问题的 NumPy 函数?

【问题讨论】:

  • “来自 41 个温度和 101 个密度值的值”你到底是什么意思?您的意思是 0 和 41 以及 0 和 101 之间的两个实数值?还是从 41 和 101 个元素的两个数组中选取两个实数值(其中每个值与 5D 数组中的相应位置相关联)?或者两个这样的数组所覆盖的范围内的两个任意实数值(并相应地进行插值)?

标签: numpy interpolation data-analysis


【解决方案1】:

让我们一步一步开始吧:

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

最后但同样重要的是,如果 aTemperatureVALUEaDensityVALUE 变量不是 5D 的索引,而是数据值,您在其中寻找寻求 3D 立方体数据点值的插值,numpy 可以与分段线性插值一起使用(有一些约束),但对每个结果进行任何此类插值(在插值值的 3D 立方体中)需要基于原始 5D 数据点中存在的最接近-{ lower, upper } 温度和密度值的值,对每个 3D 立方体坐标运行 2D 插值。

numpy(nD; n = 0+ .meshgrid() 方法,.argwhere() 和其他)中还有其他智能工具,但发现(预排序),可能需要间接索引,在如果原始 5D 数据点没有表现出某些属性,例如数据点的 3D 立方体已经在前两个维度中进行了预排序,以便于处理所寻求的 2D-(temp,密度)-插值器(专门为dtype=uint8float64complex128object 量身定制)。

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多